我有以下XML:
<doc>
<divider />
<p>text</p>
<p>text</p>
<p>text</p>
<p>text</p>
<p>text</p>
<divider />
<p>text</p>
<p>text</p>
<divider />
<p>text</p>
<divider />
</doc>
我想选择第一个分离元件之后的P节点,直到分离元件的下一次出现。 我试着用以下XPath:
//divider[1]/following-sibling::p[following::divider]
但问题是它会选择最后分离元件前的所有p元素。 我不知道如何使用XPath 1去做。
相同的概念作为bytebuster,但不同的XPath:
/*/p[count(preceding-sibling::divider)=1]
下面是一般的XPath表达式 :
/*/divider[$k]
/following-sibling::p
[count(.|/*/divider[$k+1]/preceding-sibling::p)
=
count(/*/divider[$k+1]/preceding-sibling::p)
]
如果你替换$k
有1
则完全通缉p
节点选择。
如果你替换$k
与2
那么所有p
第二和第三个元素之间divider
,......等等
说明 :
这是Kayessian XPath 1.0中公式节点集相交的一个简单的应用:
$ns1[count(.|$ns2) = count($ns2)]
选择属于同时向节点集的所有节点$ns1
和$ns2
。
在这种特定的情况下,我们代替$ns1
有:
/*/divider[$k]/following-sibling::p
我们代替$ns2
有:
/*/divider[$k+1]/preceding-sibling::p
怎么样选择所有p
具有正好一个元素divider
为preceding-sibling
?
//doc/p[preceding-sibling::divider[1] and not (preceding-sibling::divider[2])]
我觉得有一个更简单,也许更快的解决方案:您希望至少有一个兄弟分隔前第二分频器的所有前面的兄弟姐妹:
/doc/divider[2]/preceding-sibling::p[preceding-sibling::divider]
问题就变得更复杂一点,当然,如果你想找到第二个和第三个分隔的段:那么你想要的东西更像是丹尼尔Haley的解决方案。