XPath子集选择

时间:2010-08-28 11:43:18

标签: html xml xpath

我有以下XML(实际上是HTML):

<html>
    <h4>something</h4>
    <p>a</p>
    <p>b</p>
    <h4>otherthing</h4>
    <p>c</p>
</html>

XPath是否可以选择跟随第一个“h4”节点的兄弟节点但不跟随第二个“h4”节点的兄弟节点的“p”节点(仅选择“p”节点a&amp; b)?

3 个答案:

答案 0 :(得分:4)

我的看法

//p[preceding-sibling::h4[1] and not(preceding-sibling::h4[position() > 1])]

找到所有p元素,它们是第一个h4的兄弟,但不是同一轴上任何其他h4的兄弟姐妹

替代

//h4[1]/following-sibling::p[count(preceding-sibling::h4) = 1]

查找第一个h4元素的后续p元素,它只有一个前面的h4元素

答案 1 :(得分:3)

使用

/*/h4[1]/following-sibling::p
            [not(count(preceding-sibling::* | /*/h4[2])
                =
                 count(preceding-sibling::*)
                 )
             ]

更一般地说,两个节点集$ns1$ns2的交集是选择:

$ns1[count(.|$ns2) = count($ns2)]

节点$ n不在节点集$ ns1中的事实由表示:

not(count($n | $ns1) = count($ns1))

这是标准XPath |(联合运算符和not()函数的基本集合理论和用法。

答案 2 :(得分:1)

假设第一个<p>之前没有<h4>

//h4[2]/preceding-sibling::p