使用这样的元素:
<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'
。
答案 0 :(得分:1)
在XPath 1.0中,很遗憾很难在一个表达式中处理字符串操作,你可能不会非常喜欢下面的解决方案。如果您能够使用XPath 2.0,这将变成一个简单的.[tokenize(., ' ')[. = ('two', 'three', 'four')]]
。
如果没有像XSLT这样的宿主语言的帮助,我们就会陷入重复的困境。但是,如果我们要忽略没有前导或尾随空间的事实,这是一个可能但有点天真的解决方案:
.[contains(., 'two ') and contains(., ' two')]
在此基础上,我们可以添加前导/尾随空间,创建一个有点笨拙但又可行的XPath 1.0解决方案:
.[contains(concat(' ', ., ' '), ' two ')]
在此表达式中,concat(...)
将当前元素的字符串值与前后的空格连接起来。这确保了如果我们在示例中测试给定文本'two'
,则只有至少有一个前导空格和一个带尾随空格的文本时才会出现。
在此基础上,我们可以进一步扩展这个以测试多种条件:
.[contains(concat(' ', ., ' '), ' two ') and contains(concat(' ', ., ' '), ' three ')]
鉴于你在原始问题中的评论,焦点已经在element
,我开始使用一个前导点表达所有表达式。只需将其替换为选择element
的选择表达式。