使用 Xpath 检查 XML 中重复节点下的节点是否存在

Check existence of a node under a repeating node in XML using Xpath

我有以下 XML,

<Root>
  <Node>
    <Child>ch</Child>
    <Child>ch1</Child>
  </Node>

  <Node>
    <Child>ch2</Child>
    <Child>ch3</Child>
  </Node>

我想检查 XML 中的所有节点是否至少有一个 child 节点。 如果我使用 boolean(//Node/Child) 它将检查整个 XML 并且如果任何节点不这样做也不会抱怨。有一个 Child 节点。 如果我使用谓词来提及职位,它会起作用 - boolean(//节点[1]/Child).

谢谢 菅田

可以通过 Nodes 计数,Child 计数为零

not(count(//Node[count(Child) = 0]) > 0)

给出

<Root>
  <Node>
    <Child>ch</Child>
    <Child>ch1</Child>
  </Node>

  <Node>
    <Child>ch2</Child>
    <Child>ch3</Child>
  </Node>
  <Node/>
</Root>

测试失败,Node 个元素为空。也就是说,空元素的个数大于零。

xmllint --xpath 'not(count(//Node[count(Child) = 0]) > 0)' test.xml; echo
false

删除<Node/>

xmllint --xpath 'not(count(//Node[count(Child) = 0]) > 0)' test.xml; echo
true

如果存在2个空节点

xmllint --xpath 'count(//Node[count(Child) = 0])' test.xml; echo
2

可靠的 XPath-2.0 解决方案将使用这样的 quantified expression

every $x in /Root/Node satisfies count($x/*)

这里使用的事实是 count(...) 函数的所有大于零的值都被解释为 TRUE。明确地说,它将是 count($x/*) > 0.