XPath的选择两个特定元素之间的所有元素XPath的选择两个特定元素之间的所有元素(XPath s

2019-05-16 22:40发布

我有以下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去做。

Answer 1:

相同的概念作为bytebuster,但不同的XPath:

/*/p[count(preceding-sibling::divider)=1]


Answer 2:

下面是一般的XPath表达式

/*/divider[$k]
    /following-sibling::p
       [count(.|/*/divider[$k+1]/preceding-sibling::p)
       =
        count(/*/divider[$k+1]/preceding-sibling::p)
       ]

如果你替换$k1则完全通缉p节点选择。

如果你替换$k2那么所有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


Answer 3:

怎么样选择所有p具有正好一个元素dividerpreceding-sibling

//doc/p[preceding-sibling::divider[1] and not (preceding-sibling::divider[2])]


Answer 4:

我觉得有一个更简单,也许更快的解决方案:您希望至少有一个兄弟分隔前第二分频器的所有前面的兄弟姐妹:

/doc/divider[2]/preceding-sibling::p[preceding-sibling::divider]

问题就变得更复杂一点,当然,如果你想找到第二个和第三个分隔的段:那么你想要的东西更像是丹尼尔Haley的解决方案。



文章来源: XPath select all elements between two specific elements
标签: xml xslt xpath