2014-02-14 34 views
1

我只想返回不包含BB子节点的AA节点。我正在使用XPath 1.0 btw。XML XPath 1.0 - 如何在XPath表达式中正确使用'not'函数

示例XML文件:

<?xml version="1.0" encoding="UTF-8"?> 
<T> 
<AA> 
    <ZZ>z</ZZ>   
</AA> 
<AA> 
    <BB>b1</BB>   
</AA> 
<AA> 
    <BB>b2</BB>   
    <CC>c</CC>   
</AA> 
<AA> 
    <CC>c</CC>   
    <DD>d</DD>   
</AA> 
</T> 

因此,与上述exampe,只有第一个和最后一个节点AA应该返回。 我已经试过类似:

// AA/* [不是(BB)]/..

...但是这仍然返回所有4节5号节点。

1.0中的'not'函数是否可用? 如果是这样,我做错了什么?谢谢...

+0

不知道这与Perl来呢? – ikegami

+0

对不起,出于习惯...只有当我只包括一个'我的'stht,是吧? – CraigP

回答

1

记住

//AA/*[not(BB)]/.. 

只有很短的方式或写

descendant::AA/child::*[not(child::BB)]/parent::node() 

因为这使得更加明显,BB不检查的名称上下文节点是BB,它找到名为BB的孩子。


你检查如果AA子元素子元素BB

你想检查AA元素是否有子元素BB

//AA[not(BB)] 
+0

谢谢;是的,那是有效的......我可以发誓我试过...... geez! – CraigP

0

您可以使用:

//AA[not(BB)] 

您尝试的表达式选择不包含BB包含在AA的元素。

+0

是的,谢谢你,那是有效的。 – CraigP

2

您的表达式选择子节点为AA的子节点,该节点没有BB作为子节点。如果您对AA节点的说法,那么你应该得到你想要的东西:

use strict; 
use warnings; 

use XML::XPath; 

my $xp = XML::XPath->new(filename => 'test.xml'); 

my $nodeset = $xp->find('//AA[not(BB)]'); 

foreach my $node ($nodeset->get_nodelist) { 
    print "FOUND:\n"; 
    print ' ', $node->toString, "\n"; 
} 

,输出:

FOUND: 
<AA> 
    <ZZ>z</ZZ>   
</AA> 
FOUND: 
<AA> 
    <CC>c</CC>   
    <DD>d</DD>   
</AA>