选择的Xpath父属性



xml文档语法:

<x name="GET-THIS">
  <y>
    <z>Z</z> 
    <z>Z__2</z>
    <z>Z__3</z>   
  </y>
</x>

我能得到所有的z元素使用:

xpath("//z")

但是在那之后我就卡住了,我不知道下一步该做什么。我真的不明白..父方法

的语法

那么,我如何获得元素的父元素的父元素的属性呢?

不需要遍历父元素,只需找到合适的父元素:

  • //x将选择所有x元素。
  • //x[//z]将选择所有具有z元素作为后代的x元素。
  • //x[//z]/@name将获得这些元素的name属性。

你已经有了一个公认的好答案,但这里有一些其他有用的表达:

  • //z/ancestor::x/@name -查找任意位置的<z>元素,然后查找所有祖先<x>元素,然后查找它们的name="…"属性。

  • //z/../../@name -查找<z>元素,然后查找这些元素的父节点,然后查找这些元素的父节点,然后查找最终集合的name属性。

    • 这与://z/parent::*/parent::*/@name相同,其中*表示"具有任何名称的元素"。
  • //是有用的,但效率低下。如果您知道层次结构是x/y/z,那么执行//x[y/z]/@name

  • 这样的操作会更有效。

我没有声誉,所以我不能在Blender接受的答案中添加评论。但他的回答一般来说是行不通的。正确的版本是

//x[.//z]/@name

解释很简单-当你使用像[//z]这样的过滤器时,它会在全局上下关系中搜索'z',即如果xml包含至少一个节点z,它会返回true。例如,它将从下面的xml中选择两个名称:

<root>
  <x name="NOT-THIS">
  </x>
  <x name="GET-THIS">
     <y>
        <z>Z</z> 
        <z>Z__2</z>
        <z>Z__3</z>   
     </y>
  </x>
</root>

Filter [.//z]使用当前节点(.)的上下文,即x,并且只返回第二个名称。

相关内容

  • 没有找到相关文章

最新更新