如何在XSLT 2.0中扩展replace函数实现多字符串替换?
XSLT 2.0 多字符串替换的正确写法
你当前的代码里第二个replace的参数顺序写错了,正确的replace语法是replace(输入字符串, 匹配正则表达式, 替换字符串),你错误地把当前节点.放到了参数位置,导致语法失效。
要实现多组字符串替换,最直接的方式是嵌套调用replace函数,每一层完成一组替换;如果替换规则较多,也可以用变量存储中间结果,让代码更易读。
嵌套替换写法示例
比如要替换换行符、.p..nbsp...p.,再加一组foo替换为bar的规则,代码可以这么写:
<xsl:value-of select="replace(replace(replace(., '\n', ''), '\.p\.\.nbsp\.\.\.p\.', ''), 'foo', 'bar')" disable-output-escaping="yes" />
注意:正则表达式里的.是匹配任意字符的特殊符号,如果要匹配字面量的.,必须加转义符\。
更清晰的变量写法
如果替换规则很多,嵌套会显得臃肿,用变量拆分步骤更直观:
<xsl:variable name="clean-newline" select="replace(., '\n', '')" /> <xsl:variable name="clean-p-tag" select="replace($clean-newline, '\.p\.\.nbsp\.\.\.p\.', '')" /> <xsl:variable name="replace-foo" select="replace($clean-p-tag, 'foo', 'bar')" /> <!-- 可继续添加更多替换步骤 --> <xsl:value-of select="$replace-foo" disable-output-escaping="yes" />
额外提示
如果只是替换固定字符串(不需要正则匹配),可以在replace的第四个参数指定'q'(引号模式),这样不用转义.等正则特殊字符,直接写字面串即可:
<xsl:value-of select="replace(., '.p..nbsp...p.', '', 'q')" />
内容的提问来源于stack exchange,提问作者Daniel Steiner
相关产品推荐
相关产品推荐

