我需要使用 xsl 1.0
从字符串值中删除以下字符:
*, /, \, #, %, !, @, $, (, ), &
我已经想到了以下方法:
translate(translate(translate(string(//xpath/@value),'.',''),'/',''),',','')
在上述方法中,每个字符都需要重复编写相同的代码(一次 per character)。
如何在不重复编写代码的情况下实现相同的目标?
谢谢 :-)
translate()
函数接受两个字符串作为第二个和第三个参数 -- 不仅仅是两个字符。
translate(., $string1, '')
生成一个字符串,该字符串是上下文(当前)节点的字符串值,在其中删除任何在$string1
中出现的字符。
因此您可以使用:
translate(expressionSelectingNode, "/\#%!@$()&", "")
删除第二个参数中包含的任何字符。
当然,如果在XSLT样式表内(或一般情况下在XML文档内)使用translate()
函数时,有些特殊字符,例如 <
和 &
必须分别转义为 <
和 &
。
使用这个函数非常强大,可以删除一组未知字符:
想象一下,您想从任何字符串中删除所有不是数字的字符。我们事先不知道字符串中会出现哪些字符,因此不能只枚举它们作为translate()
函数的第二个参数。但是我们仍然可以像这样删除所有这些未知字符:
translate(., translate(., '0123456789', ''), '')
内部的 translate()
会生成不带任何数字的字符串。
外部的 translate()
从原始字符串中删除所有这些非数字字符(通过内部的 translate()
找到)-- 因此剩下的只有数字字符。
您只需在纯XPath中分别使用translate(//foo/@value, '*\%!@$&', '')
即可。在XML文档中,例如XSLT样式表中,您需要转义&符号:<xsl:value-of select="translate(//foo/@value, '*\%!@$&', '')"/>
。
translate(translate(., '0123456789', ''), '')
这一行中,我认为外部的 translate 缺少第一个参数,不是吗? - Beskatranslate()
的第一个参数是内部translate()
的结果,第二个参数是一个空字符串。因此,这两个参数分别是: 1.translate(., '0123456789', '')
和 2.''
。 - Dimitre Novatchev.
-- 所以应该是:translate(.,translate(., '0123456789', ''), '')
。我已经编辑了答案。感谢您注意到这一点! - Dimitre Novatchev