XPath - 没有具有属性的子项时查找父项

时间:2012-07-25 17:48:40

标签: xml 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'])]

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

最好的方法是什么?

2 个答案:

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