如何用XSL替换XML元素的前两个字符?求示例及参考资料
当然可以用XSL搞定这个需求!
首先得区分你用的是XSLT 1.0还是XSLT 2.0及以上版本,不同版本的函数支持差异不小,我分别给你实用的示例:
情况1:用XSLT 2.0+(支持replace()函数)
replace()函数的用法是 replace(输入字符串, 匹配模式, 替换内容)。要替换前两个字符的话,正则表达式可以用^..——^表示字符串开头,..能匹配任意两个字符。
举个实际场景的例子:
假设你的源XML长这样:
<root> <text>ABCD123</text> <text>XYZZY</text> </root>
对应的XSLT代码如下:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 处理需要修改的text元素 --> <xsl:template match="text()"> <xsl:copy> <!-- 把前两个字符替换成"XX",你可以改成自己需要的内容 --> <xsl:value-of select="replace(., '^..', 'XX')"/> </xsl:copy> </xsl:template> <!-- 保留其他所有节点的原有结构 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
转换后的结果会是:
<root> <text>XXCD123</text> <text>XXZZY</text> </root>
情况2:用XSLT 1.0(没有内置replace()函数)
XSLT 1.0里没有自带的replace(),但可以用substring()函数组合实现:截取从第3个字符开始的子串,再拼接上你想要替换的内容。
还是用上面的源XML,对应的XSLT代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="text()"> <xsl:copy> <!-- 处理字符串长度不足2的情况,避免出错 --> <xsl:choose> <xsl:when test="string-length(.) >= 2"> <xsl:text>XX</xsl:text> <xsl:value-of select="substring(., 3)"/> </xsl:when> <xsl:otherwise> <xsl:text>XX</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
额外小提示
- 如果你的需求是删除前两个字符而不是替换,那就更简单:XSLT 2.0+用
replace(., '^..', ''),XSLT 1.0直接用substring(., 3)。 - 如果前两个字符是特定类型(比如只替换开头的两个小写字母),可以把正则改成
^[a-z]{2},灵活调整匹配规则就行。
内容的提问来源于stack exchange,提问作者Ale
相关产品推荐
相关产品推荐

