Html XPath子集选择

Html XPath子集选择,html,xml,xpath,Html,Xml,Xpath,我有以下XML(实际上是HTML): 某物 a b 其他的 c XPath能否选择跟随第一个“h4”节点的同级但不跟随第二个“h4”节点的同级的“p”节点(仅选择“p”节点a和b)?假设在第一个之前没有 我的看法 //p[preceding-sibling::h4[1] and not(preceding-sibling::h4[position() > 1])] 查找第一个h4的同级元素的所有p元素,但不查找同一轴上任何其他h4的同级元素 另类 //h4[1]/following-

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


某物
a

b

其他的 c


XPath能否选择跟随第一个“h4”节点的同级但不跟随第二个“h4”节点的同级的“p”节点(仅选择“p”节点a和b)?

假设在第一个
之前没有

我的看法

//p[preceding-sibling::h4[1] and not(preceding-sibling::h4[position() > 1])]
查找第一个h4的同级元素的所有p元素,但不查找同一轴上任何其他h4的同级元素

另类

//h4[1]/following-sibling::p[count(preceding-sibling::h4) = 1]
查找第一个h4元素的所有后续p元素,这些元素的前面正好有一个h4元素

使用

/*/h4[1]/following-sibling::p
            [not(count(preceding-sibling::* | /*/h4[2])
                =
                 count(preceding-sibling::*)
                 )
             ]
not(count($n | $ns1) = count($ns1))
更一般地说,两个节点集
$ns1
$ns2
的交集由以下人员选择:

$ns1[count(.|$ns2) = count($ns2)]
节点$n不在节点集$ns1中的事实表示为

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

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

它不是选择第一个h4的后续同级,而是选择第二个h4的前面同级,这是一个区别,尽管它产生了正确的result@Gordon//h4[1]/下面的兄弟姐妹::p返回一个b和c。Kenny的答案是有意义的,但也需要处理只有一个h4元素的情况。@nonnb我没有说它没有意义。我只是说,它与所问的不同。好问题(+1)。有关使用通用XPath表达式进行节点集交集和检查节点是否不在给定节点集中的解决方案,请参阅我的答案。我认为您可以将第一个答案简化为
/*/p[not(前面的兄弟姐妹::h4[2])]
,将第二个答案简化为
/*/p[count(前面的兄弟姐妹::h4)=1]