[英]XPath condition for a whitespace separated text node
使用这样的元素:
<element>one two two-and-a-half three four</element>
有没有一种方法可以定义XPath 1.0条件(评估为布尔值),该条件将检查元素的文本节点是否包含一个或多个空格分隔的值,例如"two"
和"three"
,并假设这些值可以以任何顺序出现? 这些值还可以包含其他值的一部分,如"two"
和"two-and-a-half"
。
该问题与XPath编码模式有关,并且不假定特定的编程语言/工具上下文。 为了便于讨论,您可以假定element
已经是表达式的上下文节点,并且
. = 'one two two-and-a-half three four'
因此将评估为true
。
不幸的是,在XPath 1.0中,很难在一个表达式中处理字符串操作,您可能不会非常喜欢下面的解决方案。 如果您能够使用XPath 2.0,这将成为一个简单的.[tokenize(., ' ')[. = ('two', 'three', 'four')]]
.[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
select表达式即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.