使用xsl删除字符

Din*_*108 17 xml xslt xslt-1.0

我需要使用从字符串值中删除以下字符 xsl 1.0

*, /, \, #, %, !, @, $, (, ), &

我想出了以下内容:

translate(translate(translate(string(//xpath/@value),'.',''),'/',''),',','')
Run Code Online (Sandbox Code Playgroud)

在上面的方法中,我将不得不多次复制相同的代码(每个字符一次).

如何在不重复代码的情况下实现相同的目标?

谢谢 :-)

Dim*_*hev 22

translate()函数接受两个字符串作为其第二个和第三个参数- 而不仅仅是两个字符.

translate(., $string1, '')
Run Code Online (Sandbox Code Playgroud)

生成一个字符串,该字符串是上下文(当前)节点的字符串值,其中任何出现的字符的出现都将$string1被删除.

因此你可以使用:

translate(expressionSelectingNode, "/\#%!@$()&", "")
Run Code Online (Sandbox Code Playgroud)

删除第二个参数中包含的任何字符.

当然,如果translate()函数在XSLT样式表中使用(或者通常在XML文档中),则某些特殊字符(例如<和)&必须分别作为&lt;和转义&amp;.

使用它是如此强大,可以删除一组未知字符:

想象一下,您想要从任何字符串中删除所有非数字字符.我们事先并不知道字符串中会出现什么字符,因此我们不能在第二个参数中枚举它们translate().但是我们仍然可以删除所有这些未知的字符:

translate(., translate(., '0123456789', ''), '')
Run Code Online (Sandbox Code Playgroud)

内部translate()产生的字符串没有任何数字.

外部translate()删除translate()原始字符串中的所有这些非数字字符(由内部找到) - 因此剩下的只是数字字符.


Mar*_*nen 17

您只需要translate(//foo/@value, '*\%!@$&', '')在纯文本中分别在XSLT样式表等XML文档中使用,您需要转义&符号<xsl:value-of select="translate(//foo/@value, '*\%!@$&amp;', '')"/>.