【问题标题】:XPath condition for a whitespace separated text node空格分隔的文本节点的 XPath 条件
【发布时间】:2015-09-16 09:05:06
【问题描述】:

使用这样的元素:

<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

【问题讨论】:

    标签: xml xpath xpath-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 的选择表达式即可。

    【讨论】:

    • 顺便说一句,normalize-space() 可以处理任何多余的空格,所以contains(concat(' ', normalize-space(.), ' '), ' two ') 可以工作。我没有提到我的值之间可能多次出现空格。
    • 要测试字符串是否包含“一个或多个”相关术语,请在 contains() 测试之间使用“或”而不是“和”。
    • @predi,没错。 normalize-space() 是你的朋友。
    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2021-02-26
    相关资源
    最近更新 更多