使用XSL删除字符

17

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

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

我已经想到了以下方法:

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

在上述方法中,每个字符都需要重复编写相同的代码(一次 per character)。

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

谢谢 :-)

2个回答

24

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

translate(., $string1, '')

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

因此您可以使用:

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

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

当然,如果在XSLT样式表内(或一般情况下在XML文档内)使用translate()函数时,有些特殊字符,例如 <& 必须分别转义为 &lt;&amp;

使用这个函数非常强大,可以删除一组未知字符:

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

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

内部的 translate() 会生成不带任何数字的字符串。

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


这对我很有帮助,但是在 translate(translate(., '0123456789', ''), '') 这一行中,我认为外部的 translate 缺少第一个参数,不是吗? - Beska
@Beska,不是这样的,外部的 translate() 的第一个参数是内部 translate() 的结果,第二个参数是一个空字符串。因此,这两个参数分别是: 1. translate(., '0123456789', '') 和 2. '' - Dimitre Novatchev
但是 translate 不需要三个参数吗?(当我尝试直接使用这段代码时,它会报错。我必须将路径作为第一个参数添加进去。) - Beska
@Beska 你说得对--这里缺少的是第一个参数,即上下文节点 . -- 所以应该是:translate(.,translate(., '0123456789', ''), '')。我已经编辑了答案。感谢您注意到这一点! - Dimitre Novatchev

17

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接