XML:/A/B
或/A
我想获取A
没有任何子节点的所有节点B
。
我试过了
/A[not(B)]
/A[not(exists(B))]
没有成功
/*[local-name()="A" and .... ]
如果可能,我更喜欢使用语法的解决方案。有什么想法可行吗?
澄清。xml看起来像:
<WhatEver>
<A>
<B></B>
</A>
</WhatEver>
要么
<WhatEver>
<A></A>
</WhatEver>
XML:/A/B
或/A
我想获取A
没有任何子节点的所有节点B
。
我试过了
/A[not(B)]
/A[not(exists(B))]
没有成功
/*[local-name()="A" and .... ]
如果可能,我更喜欢使用语法的解决方案。有什么想法可行吗?
澄清。xml看起来像:
<WhatEver>
<A>
<B></B>
</A>
</WhatEver>
要么
<WhatEver>
<A></A>
</WhatEver>
//A[not(B)] or /*/A[not(B)]
吧?
Answers:
也许
*[local-name() = 'A' and not(descendant::*[local-name() = 'B'])]
吧?
另外,应该只有一个根元素,因此对于/A[...]
您来说,要么取回所有XML,要么不取回所有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" />
试试这个"/A[not(.//B)]"
或这个"/A[not(./B)]"
。
如果您尝试从根目录的层次结构中的任意位置获取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中没有n种方法可以实现相同的目的。
注意:XPath区分大小写,因此,如果您的节点名称不同(我确定没有人会使用A,B),那么请确保大小写匹配。