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