1

我有一个带有“hello”节点的 XML 文件,其中包含“word”节点:

<doc>
    <hello>
        <word>Hello</word><word>World</word><word>!</word>
    </hello>
    <hello>
        <word>Hello</word><word>!</word><word>World</word>
    </hello>
    <hello>
        <word>Hello</word><word>World</word><word>!</word><word>blorf</word>
    </hello>
    <hello>
        <word>Hello</word><word>Wo</word><word>rld!</word>
    </hello>
</doc>

我想匹配唯一的第一个hello。第二个顺序错了,第三个多了一个单词。第四个有正确的文本,但不正确地划分单词。


此查询在 XPath 1.0 中有效,但非常冗长。有没有更简单的方法?

//hello[count(word) = 3 and word[1] = "Hello" and word[2] = "World" and word[3] = "!"]

这适用于 XPath 2.0。有什么方法可以在 XPath 1.0 中进行等效操作吗?

//hello[deep-equal(data(subsequence(word,1)),('Hello','World','!'))]
4

3 回答 3

1

您可以使用以下XPATH 1.0

//hello[
  word[1][
    .='Hello' and following-sibling::word[1][
      .='World' and following-sibling::word[1][
        .='!' and count(following-sibling::word)=0
      ]
    ]
  ]
]

输出

<hello>
    <word>Hello</word><word>World</word><word>!</word>
</hello>
于 2013-10-07T18:06:07.493 回答
1

只需将整个 Hello-node 视为文本:

//hello[normalize-space(.) = "HelloWorld!"]
于 2013-10-07T23:16:02.910 回答
1

如果您使用的是 XPath 2.0,则可以使用string-join()添加分隔符来分隔各个单词。

//hello[string-join(word,'|')='Hello|World|!']

normalize-space(word)如果应该忽略空白,您可能需要使用。

另一个 XPath 2.0 替代方法是用于deep-equal()比较两个序列。这会更安全,因为它没有使用可能是文本值一部分的分隔符。

//hello[deep-equal(data(subsequence(word,1)),('Hello','World','!'))]
于 2013-10-08T06:59:58.360 回答