XPath – 获取没有特定types的子节点

XML: /A/B/A

我想得到所有没有任何B孩子的A节点。

我试过了

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

没有成功

如果可能的话,我更喜欢使用语法/*[local-name()="A" and .... ]的解决scheme。 任何想法的作品?

澄清。 XML看起来像:

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

要么

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

也许*[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 [不是(B)],它可以find文档中所有没有直接B子节点的A节点。

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

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

如果您试图从根目录中获取层次结构中的任何位置,则可以运行(对于xslt 1.0以及xslt中使用的2.0)

 //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),那么请确保大小写匹配。

用这个:

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