XPath-获取没有特定类型子节点的节点

XML: /A/B/A

我希望得到所有没有任何 B子节点的 A节点。

我试过了

/A[not(B)]
/A[not(exists(B))]

没有成功

如果可能的话,我更喜欢使用语法 /*[local-name()="A" and .... ]的解决方案。有什么可行的办法吗?

Xml 看起来像:

<WhatEver>
<A>
<B></B>
</A>
</WhatEver>

或者

<WhatEver>
<A></A>
</WhatEver>
76238 次浏览

也许吧 *[local-name() = 'A' and not(descendant::*[local-name() = 'B'])]

而且,应该只有一个根元素,因此对于 /A[...],要么获得所有 XML,要么一个也没有。也许是 //A[not(B)]或者 /*/A[not(B)]

我真不明白为什么 /A[not(B)]不适合你。

~/xml% xmllint ab.xml
<?xml version="1.0"?>
<root>
<A id="1">
<B/>
</A>
<A id="2">
</A>
<A id="3">
<B/>
<B/>
</A>
<A id="4"/>
</root>
~/xml% xpath ab.xml '/root/A[not(B)]'
Found 2 nodes:
-- NODE --
<A id="2">
</A>
-- NODE --
<A id="4" />

第一个/导致 XPath 从文档的根目录开始,我怀疑这是您想要的。

也许您指的是//A [ not (B)] ,它将在任何级别上找到文档中没有直接 B 子节点的所有 A 节点。

或者您已经在一个包含 A 节点的节点上,在这种情况下,您只需要 A [ not (B)]作为 XPath。

如果您试图从根目录中获取层次结构中的任何位置的 A,那么这种方法就可以工作(对于 xslt 1.0和2.0,如果它在 xslt 中使用的话)

//descendant-or-self::node()[local-name(.) = 'a' and not(count(b))]

或者你也可以这样做

//descendant-or-self::node()[local-name(.) = 'a' and not(b)]

或者也

//descendant-or-self::node()[local-name(.) = 'a' and not(child::b)]

在 xslt 中没有任何方法可以达到同样的效果。

注意: XPath 是区分大小写的,所以如果您的节点名称不同(我确信没有人会使用 A、 B) ,那么请确保大小写匹配。

试试这个 "/A[not(.//B)]"或这个 "/A[not(./B)]"

用这个:

/*[local-name()='A' and not(descendant::*[local-name()='B'])]