1

使用这样的元素:

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

有没有办法定义一个 XPath 1.0 条件(计算为布尔值)来检查元素的文本节点是否包含一个或多个空格分隔值,例如"two"and "three",假设这些值可能以任何顺序出现?这些值还可能包含其他值的一部分,如"two"和所示"two-and-a-half"

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

. = 'one two two-and-a-half three four'

因此将评估为true

4

1 回答 1

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

于 2015-09-16T09:25:30.607 回答