Xpath 仅选择具有匹配属性的直接兄弟姐妹

2024-03-24

我有以下示例文档:

<root>
  <p class="b">A</p>
  <p class="b">B</p>
  <p class="a">C</p>
  <p class="a">D</p>
  <p class="b">E</p>
  <x>
    <p class="b">F</p>
  </x>
</root>

我正在寻找一个选择所有的 xpath 表达式direct具有匹配类属性的给定节点的兄弟节点,而不是任何兄弟节点。在上面的例子中,前两个<p class="b">应选择A-B;同样,两个<p class="a">C-D,同样是第五张单曲<p class="b">E 因为它没有direct兄弟姐妹;同样是单身<p class="b">F 里面<x>。请注意,在这种情况下,B 和 C 不是直接兄弟,因为它们具有不同的类属性值!

我所拥有的是这样的:

xml.xpath("//p") # This selects all six <p> elements.
xml.xpath("//p[@class='b']") # This selects all four <p class="b"> elements.
xml.xpath("//p/following-sibling::p[@class='b']") # This selects all <p class="b"> sibling elements, even though not direct siblings.

最后一个表达式也选择第五个同级,尽管中间有不匹配的同级。

如何仅选择具有相同特征的直系兄弟姐妹class value?

Edit澄清一下:请注意最后两个是个人选择,而不是兄弟姐妹!

Edit我保存了一个例子here http://www.xpathtester.com/obj/d091aa13-df0b-455d-be9d-66a7ce66c477。 Xpath表达式基于/root/p[1]应该选择A, B, C, D.


要获取下一个同级,您可以在旁边添加位置 - 1 含义。

following-sibling::*[1]

为了确保下一个兄弟节点属于特定的节点类型,您可以添加以下过滤器,其中 p 是我们要匹配的节点类型。

[self::p]

如果您只想要具有相同属性的属性,则还需要在第一个 p 元素上指定属性。

因此,如果您只想要紧邻 class b p 元素之后的 class b p 元素,则可以执行以下操作。这只会给你第二个 p 元素。

//p[@class='b']/following-sibling::*[1][@class='b'][self:p]

听起来您可能实际上想要与另一个 b 类元素相邻的任何 b 类元素。在这种情况下,您可以检查后面和前面的同级。下面将为您提供前 2 个 p 元素。

//p[@class='b'][following-sibling::*[1][@class='b'][self::p] 
                or preceding-sibling::*[1][@class='b'][self::p]]    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xpath 仅选择具有匹配属性的直接兄弟姐妹 的相关文章

随机推荐