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'])]