我正在尝试查找对没有具有特定属性值的子节点(属性)的节点(报告)的每个引用。
我的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'])]
问题是,当我正在寻找不返回任何内容时,它会返回报告。
最好的方法是什么?
答案 0 :(得分:1)
问题是您的报告包含的属性不是evenHandlerClass。你想说没有这样的孩子,这可以通过计算这些孩子并获得零来完成:
/*[local-name()='report'][count(*[(local-name()='property' and @name="eventHandlerClass")])=0]
答案 1 :(得分: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']
)
]