稍熟悉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>
转换结果:
源字符串 | FromString | ToString | 替换结果 |
---|---|---|---|
asdflaksdjfalsdkfjaslkdjf | a | bbb | bbbsdflbbbksdjfbbblsdkfjbbbslkdjf |
asdflaksdjfalsdkfjaslkdjf | flaksdjfals | bbb | asdbbbdkfjaslkdjf |
asdflaksdjfalsdkfjaslkdjf | djfa | bbb | asdflaksbbblsdkfjaslkdjf |
asdflaksdjfalsdkfjaslkdjf | sdf | VVV | aVVVlaksdjfalsdkfjaslkdjf |
我不是四川人 | 四川 | 重庆 | 我不是重庆人 |
SELECT * FROM TAble where a=b | = | *= | SELECT * FROM TAble where a*=b |