如何通过在 XPath 中使用属性比较来 select 一个元素

How to select an element by using attribute comparsion in XPath

我正在尝试获取一个带有子元素的元素,该子元素与另一个节点同名(具有特定条件)。 来源:

<objects>

  <object>
    <element>
      <type name="thing"></type>
    </element>
  </object>

  <object>
    <prog name="thing">
      <extends>SuperClass</extends>
    </prog>
  </object>

</objects>

我想获取一个对象的元素,如果它的类型与另一个对象的 prog 同名(条件:prog extends "SuperClass")。

我的 Xpath:

./objects/object/element[./type/@name={ancestor::objects/object/prog[./extends/text()='SuperClass']/@name}]

I want to get an object's element, if its type has the same name as a prog (condition: prog extends "SuperClass") of another object.

//element[type/@name = //prog[extends = 'SuperClass']/@name]

"Select 所有 <element> 其中 <type>/@name 等于包含 [=18= 的任何 <prog>@name ] 等于 'SuperClass'"

你几乎已经完成了。 XPath 没有属性值模板(即花括号中的表达式)——这是 XSLT 的一个特性,在这里甚至没有必要。丢掉它们就可以了:

./objects/object/element[./type/@name=ancestor::objects/object/prog[./extends/text()='SuperClass']/@name]

一旦你剪掉了绒毛(比如 ./ 大多数时候都是隐式的,而 /text() 做了你通常不想要的事情),它看起来很像我的表情

//element[type/@name = ancestor::objects//prog[extends='SuperClass']/@name]

如果您开始查看文档根目录,那么 ancestor:: 也是多余的。

//element[type/@name = //prog[extends = 'SuperClass']/@name]

...就是这样。