我需要使用xsl 1.0
从字符串值中删除以下字符
*, /, \, #, %, !, @, $, (, ), &
我想出了以下内容:
translate(translate(translate(string(//xpath/@value),'.',''),'/',''),',','')
在上面的方法中,我将不得不多次复制相同的代码(每个字符一次)。
如何在不重复代码的情况下实现相同的目标?
谢谢 :-)
你只需要在纯文本XPath中的translate(//foo/@value, '*\%!@$&', '')
分别在一个XML文档中,比如XSLT样式表你需要逃避&符号<xsl:value-of select="translate(//foo/@value, '*\%!@$&', '')"/>
。
translate()
函数接受两个字符串作为其第二和第三个参数 - 而不仅仅是两个字符。
translate(., $string1, '')
生成一个字符串,该字符串是上下文(当前)节点的字符串值,其中删除了$string1
中任何字符的出现。
因此你可以使用:
translate(expressionSelectingNode, "/\#%!@$()&", "")
删除第二个参数中包含的任何字符。
当然,如果在XSLT样式表中使用translate()
函数(或者通常在XML文档中),则必须将<
和&
等特殊字符分别作为<
和&
进行转义。
使用它是如此强大,可以删除一组未知字符:
想象一下,您想要从任何字符串中删除所有非数字字符。我们事先并不知道字符串中会出现什么字符,因此我们不能在translate()
的第二个参数中枚举它们。但是我们仍然可以删除所有这些未知的字符:
translate(., translate(., '0123456789', ''), '')
内部translate()
产生字符串sans任何数字。
外部translate()
从原始字符串中删除所有这些非数字字符(由内部translate()
找到) - 因此剩下的只是数字字符。