如果 child 没有特定属性值,则获取 parents 属性值

Get parents attribute value if child doesn't have a specific attribute value

我在 linux 中有一个 xml 文件要处理。 我需要根据 children 获取 parent 节点的所有 ID。 在这里,我想获取 'a' 的所有 ID 'c' 而没有键“f.g”。

<a id="11111">
  <b>
    <c key="d.e">stuff1</c>
    <c key="f.g">stuff2</c>
    <c key="j.k">stuff4</c>
  </b>
</a>
<a id="22222">
  <b>
    <c key="d.e">stuff1</c>
    <c key="h.i">stuff3</c>
    <c key="j.k">stuff4</c>
    <c key="l.m">stuff5</c>
  </b>
</a>
<a id="33333">
  <b>
    <c key="c.d">stuff0</c>
    <c key="d.e">stuff1</c>
    <c key="h.i">stuff3</c>
    <c key="j.k">stuff4</c>
    <c key="l.m">stuff5</c>
  </b>
</a>

在这种情况下,我应该得到 22222 和 33333。 我不太确定如何为此编写 xpath。

您可以过滤(不是):

//a[[not(@key = 'f.g')]]

它将 return 您需要 'a' 个元素,但我不知道如何获取它们的 ID。

我想你正在寻找类似的东西:

//a[not(.//c[@key="f.g"])]/@id

可以翻译为:找到任何没有子节点 <c> 的节点 <a> 本身有一个名为 key 的属性,它本身的属性值为“ f.g".

@Jack Fleeting 的回答可能是最好的解决方案。作为替代方案(消耗更多):

//c[not(@key="f.g" or preceding-sibling::c[@key="f.g"] or following-sibling::c[@key="f.g"])]/ancestor::a

查找 c 元素,其自身以及之前或之后的兄弟姐妹包含不同于 @key="f.g" 的属性。然后 select 他们的 a 祖先。