如何使用Xpath定位不包含属性的子节点的父节点?

3
使用Xpath,如何找到一个父元素,其中没有一个多个子元素包含属性值列表中的特定属性值?
以下是我XML的示例:
<app>
  <rdg wit="#R #W #I #S #C #O #D">existunt,</rdg>
  <rdg wit="#J">existant,</rdg>
</app>

我的XML文件中有数百个<app>元素,这些元素应该在两个或多个<rdg>元素之间分别分布着相同的八个属性值(#R等)。但是其中一些<rdg>元素缺少列表中的某个属性值,我需要定位这些节点。

因此,我试图找到所有的<app>元素,其中没有一个子<rdg>元素包含#R。

我可以使用//app/rdg[contains(@wit,"#R")]来获取那些包含#R的元素,而我知道有一个not()函数,但我还没想出如何把它们结合起来使用。


你尝试过这个吗?//app/rdg[not(contains(@wit,"#R"))] - Ed Bangga
我尝试过,但它不起作用。这个Xpath可以找到所有没有#R的<rdg>元素。在上面的示例中,它会找到<rdg wit="#J">existant,</rdg>,这不是我需要的。每个<app>元素中至少有一行符合此条件。我需要找到每个<app>元素中没有在任何<rdg>元素中包含#R的内容,这意味着它需要完全跳过上面的示例<app> - haggis78
1个回答

3
您可以按照以下方式实现此操作:
//app[not(rdg/@wit[contains(., '#R')])]

或者:

//app[not(rdg[contains(@wit, '#R')])]

这种稍微复杂的方法是必要的,因为app包含多个rdg,所以我们基本上是在执行以下操作(以第二个示例为例):

  • 选择所有满足以下条件的app...
  • 没有一个子rdg满足以下条件...
  • wit属性包含#R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接