使用 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, '*\%!@$&amp;', '')"/>
。
【讨论】:
以上是关于使用 xsl 删除字符的主要内容,如果未能解决你的问题,请参考以下文章