用XSL做字符串替换

稍熟悉XPATH的人都知道,在XSL中使用translate函数可以将一个字符串进行逐字符替换。例如:

translate("bar","abc","ABC") 将得到 BAr

translate("--aaa--","abc-","ABC") 将得到 AAA。

但是,如果要替换一个子字符串为另一个子字符串,对XPATH1.0而言,用translate就有点力不从心了。

一般来讲,在XSL中进行字符串替换有以下两种方法:

(1)使用ms:script嵌入XSL实现,但要求XML解析器必须是MS的。

(2)使用纯XSL模板来实现。

当然,使用第(1)种方法有个好处就是可以充分利用javascript强大的字符串处理功能,例如还可以使用正则表达式。这里使用了一个纯XSL模板来实现字符串替换。源代码如下,其中后面的部分是用于测试的示例:

<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="
http://www.w3.org/1999/XSL/Transform">
 <!--字符串替换模板-->
 <!--
 版权所有 叶建生
yjs_lh@sohu.com yjs_lh@sina.com
 @version 1.0 2005.04.19 20:33 于重庆南坪
 -->

 <xsl:template name="StringReplace">
  <xsl:param name="SrcString"/>
  <xsl:param name="FromString"/>
  <xsl:param name="ToString"/>
  <xsl:choose>
   <xsl:when test="contains($SrcString,$FromString)">
    <xsl:value-of select="substring-before($SrcString,$FromString)"/>
    <xsl:value-of select="$ToString"/>
    <xsl:call-template name="StringReplace">
     <xsl:with-param name="SrcString" select="substring-after($SrcString,$FromString)"/>
     <xsl:with-param name="FromString" select="$FromString"/>
     <xsl:with-param name="ToString" select="$ToString"/>
    </xsl:call-template>
   </xsl:when>
   <xsl:otherwise><xsl:value-of select="$SrcString"/></xsl:otherwise>
  </xsl:choose>
 </xsl:template>
 <!--只是测试用,正式使用时可以删除此模板-->
 <xsl:template match="/">
  <html>
   <body>
    <table border="1">
     <caption>字符串替换函数</caption>
     <tr>
      <th>源字符串</th>
      <th>FromString</th>
      <th>ToString</th>
      <th>替换结果</th>
     </tr>
     <xsl:for-each select="//S">
      <tr>
      <td>
       <xsl:value-of select="Source"/>
      </td>
      <td>
       <xsl:value-of select="From"/>
      </td>
      <td>
       <xsl:value-of select="To"/>
      </td>
      <td>
       <xsl:call-template name="StringReplace">
        <xsl:with-param name="SrcString" select="Source"/>
        <xsl:with-param name="FromString" select="From"/>
        <xsl:with-param name="ToString" select="To"/>
       </xsl:call-template>
      </td>
      </tr>
     </xsl:for-each>
    </table>
   </body>
  </html>
 </xsl:template>
</xsl:stylesheet>


用于测试的XML:

<?xml version="1.0" encoding="GB2312"?>
<Root>
 <S>
  <Source>asdflaksdjfalsdkfjaslkdjf</Source>
  <From>a</From>
  <To>bbb</To>
 </S>
 <S>
  <Source>asdflaksdjfalsdkfjaslkdjf</Source>
  <From>flaksdjfals</From>
  <To>bbb</To>
 </S>
 <S>
  <Source>asdflaksdjfalsdkfjaslkdjf</Source>
  <From>djfa</From>
  <To>bbb</To>
 </S>
 <S>
  <Source>asdflaksdjfalsdkfjaslkdjf</Source>
  <From>sdf</From>
  <To>VVV</To>
 </S>
 <S>
  <Source>我不是四川人</Source>
  <From>四川</From>
  <To>重庆</To>
 </S>
 <S>
  <Source>SELECT * FROM TAble  where a=b</Source>
  <From>=</From>
  <To>*=</To>
 </S>
</Root>


转换结果:

字符串替换函数
源字符串FromStringToString替换结果
asdflaksdjfalsdkfjaslkdjfabbbbbbsdflbbbksdjfbbblsdkfjbbbslkdjf
asdflaksdjfalsdkfjaslkdjfflaksdjfalsbbbasdbbbdkfjaslkdjf
asdflaksdjfalsdkfjaslkdjfdjfabbbasdflaksbbblsdkfjaslkdjf
asdflaksdjfalsdkfjaslkdjfsdfVVVaVVVlaksdjfalsdkfjaslkdjf
我不是四川人四川重庆我不是重庆人
SELECT * FROM TAble where a=b=*=SELECT * FROM TAble where a*=b

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值