我有以下示例文档:
<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(使用前将#替换为@)