2012-07-25 57 views
0

我试图找到没有具有特定属性值的子节点(属性)的节点(报表)的每个引用。XPath - 查找没有属性的子项时的父项

我的XML是:

<report xmlns="http://www.eclipse.org/birt/2005/design"> 
<property name="comments">comment</property> 
<property name="test">sdcs</property> 
<property name="eventHandlerClass">sdcs</property> 
</report> 

,我的XPath是:

/*[local-name()='report'][not(/*[local-name()='property'][@name='eventHandlerClass'])] 

问题是,它返回时,我正在寻找它不返回任何报告。

任何想法的最佳方式来做到这一点?

回答

1

的问题是,您的报告中包含属性不是evenHandlerClass。你想说没有这样的孩子,这可以通过计数这样的孩子并得到零:

/*[local-name()='report'][count(*[(local-name()='property' and @name="eventHandlerClass")])=0] 
0

请在执行XPath之前注册一个名称空间。

使用local-name()工程,但它产生非常不雅观(和低效率)的XPath。

假设您已经注册"http://www.eclipse.org/birt/2005/design"birt

//birt:report[not(birt:property[@name='eventHandlerClass'])] 

如果由于某种原因,你不能注册一个命名空间,使用(包装的可读性)

//*[ 
    local-name() = 'report' 
    and not(
    *[@local-name() = 'property' and @name='eventHandlerClass'] 
) 
] 
+0

+1为更好的答案。 – 2012-07-30 05:33:59