用于空格分隔的文本节点的XPath条件

时间:2015-09-16 09:05:06

标签: xml xpath xpath-1.0

使用这样的元素:

<element>one two two-and-a-half three four</element>

有没有办法定义XPath 1.0条件(求值为布尔值),该条件将检查元素的文本节点是否包含一个或多个空白分隔值,例如"two"和{{1}假设值可能以任何顺序出现?这些值还可能包含其他值的部分内容,如"three""two"所示。

这个问题是关于XPath编码模式,并假设没有特定的编程语言/工具上下文。为了论证,您可以假设"two-and-a-half"已经是表达式的上下文节点,并且

element
因此,

将评估为. = 'one two two-and-a-half three four'

1 个答案:

答案 0 :(得分:1)

在XPath 1.0中,很遗憾很难在一个表达式中处理字符串操作,你可能不会非常喜欢下面的解决方案。如果您能够使用XPath 2.0,这将变成一个简单的.[tokenize(., ' ')[. = ('two', 'three', 'four')]]

XPath 1.0

如果没有像XSLT这样的宿主语言的帮助,我们就会陷入重复的困境。但是,如果我们要忽略没有前导或尾随空间的事实,这是一个可能但有点天真的解决方案:

.[contains(., 'two ') and contains(., ' two')]

在此基础上,我们可以添加前导/尾随空间,创建一个有点笨拙但又可行的XPath 1.0解决方案:

.[contains(concat(' ', ., ' '), ' two ')]

在此表达式中,concat(...)将当前元素的字符串值与前后的空格连接起来。这确保了如果我们在示例中测试给定文本'two',则只有至少有一个前导空格和一个带尾随空格的文本时才会出现。

在此基础上,我们可以进一步扩展这个以测试多种条件:

.[contains(concat(' ', ., ' '), ' two ') and contains(concat(' ', ., ' '), ' three ')]

注释

鉴于你在原始问题中的评论,焦点已经在element,我开始使用一个前导点表达所有表达式。只需将其替换为选择element的选择表达式。