繁体   English   中英

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

[英]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')]]

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 select表达式即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM