使用xsl删除字符

问题描述 投票:17回答:2

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

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

我想出了以下内容:

translate(translate(translate(string(//xpath/@value),'.',''),'/',''),',','')

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

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

谢谢 :-)

xml xslt xslt-1.0
2个回答
17
投票

你只需要在纯文本XPath中的translate(//foo/@value, '*\%!@$&', '')分别在一个XML文档中,比如XSLT样式表你需要逃避&符号<xsl:value-of select="translate(//foo/@value, '*\%!@$&amp;', '')"/>


21
投票

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

translate(., $string1, '')

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

因此你可以使用:

translate(expressionSelectingNode, "/\#%!@$()&", "")

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

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

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

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

translate(., translate(., '0123456789', ''), '')

内部translate()产生字符串sans任何数字。

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

© www.soinside.com 2019 - 2024. All rights reserved.