使用 xsl 删除字符

Posted

技术标签:

【中文标题】使用 xsl 删除字符【英文标题】:Remove characters using xsl 【发布时间】:2012-10-16 20:11:58 【问题描述】:

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

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

我想出了以下几点:

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

在上述方法中,我必须多次复制相同的代码(每个字符一次)。

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

谢谢:-)

【问题讨论】:

【参考方案1】:

translate() 函数的第二个和第三个参数接受两个字符串——不仅仅是两个字符

translate(., $string1, '')

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

因此你可以使用

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

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

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

使用这个功能非常强大,可以删除一组未知字符

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

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

内部的translate() 生成没有任何数字的字符串。

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

【讨论】:

这对我很有帮助,但是在translate(translate(., '0123456789', ''), '') 行中,我认为外部翻译缺少它的第一个参数,不是吗? @Beska,不,外部translate() 的第一个参数是内部translate() 的结果,第二个参数是空字符串。因此,参数是:1.translate(., '0123456789', '') 和 2.'' 但是翻译不需要三个参数吗? (当我按原样尝试此代码时,它向我抱怨了这一点。我必须将路径添加为第一个参数。) @Beska 你是对的——这里缺少的是第一个参数,它是上下文节点.——所以这一定是:translate(.,translate(., '0123456789', ''), '')我已经编辑了答案。感谢您注意到这一点!【参考方案2】:

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

【讨论】:

以上是关于使用 xsl 删除字符的主要内容,如果未能解决你的问题,请参考以下文章

如果祖先的属性使用 xsl 持有某个值,我如何删除属性和元素

从使用 XSL 生成的 HTML 中删除空格

XSL:删除命名空间前缀

xsl-fo 删除第一页的页码

XSL 删除重复记录

XSL 根据 Element 值删除所有前面的同级