我有以下示例文档:
<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>
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个xpath表达式,它选择具有匹配类属性的给定节点的所有直接兄弟,而不是任何兄弟.在上面的例子中,<p class="b">应该选择前两个AB; 同样是两张<p class="a">CD,同样是第五张单曲<p class="b">E,因为它没有直接的兄弟姐妹; 同样是单个<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.
Run Code Online (Sandbox Code Playgroud)
最后一个表达式也选择了第五个兄弟节点,尽管中间存在不匹配的兄弟节点.
如何仅选择具有相同class值的直接兄弟姐妹?
编辑澄清:注意最后两个是如何选择,而不是兄弟姐妹!
编辑我在这里保存了一个例子.基于的Xpath表达式/root/p[1]应该选择A, B, C, D.
Jus*_* Ko 14
为了获得下一个兄弟,你可以添加位置 - 1意思就在旁边.
following-sibling::*[1]
Run Code Online (Sandbox Code Playgroud)
要确保下一个兄弟是特定节点类型,可以添加以下过滤器,其中p是我们要匹配的节点类型.
[self::p]
Run Code Online (Sandbox Code Playgroud)
如果您只想要具有相同属性的属性,则还需要在第一个p元素上指定属性.
因此,如果您只想要紧跟在类bp元素之后的类bp元素,则可以执行以下操作.这只会给你第二个p元素.
//p[@class='b']/following-sibling::*[1][@class='b'][self:p]
Run Code Online (Sandbox Code Playgroud)
听起来你可能真的想要任何与另一个b元素相邻的b类元素.在这种情况下,您可以检查以下和之前的兄弟姐妹.以下将为您提供前2个p元素.
//p[@class='b'][following-sibling::*[1][@class='b'][self::p]
or preceding-sibling::*[1][@class='b'][self::p]]
Run Code Online (Sandbox Code Playgroud)