XPath - 通过分析follow-siblings选择第一个元素

时间:2015-09-22 04:59:03

标签: xml xpath

我有xml如下,

<section>
        <p id="ss_main">aa</p>
        <p id="ss_main">bb</p>
        <p id="main">cc</p>
        <p id="main">dd</p>
        <p id="main">ee</p>
        <p id="ss_main">ff</p>
        <p id="main">gg</p>
        <p id="main">hh</p>
        <p id="main">ii</p>
        <p id="main">jj</p>
        <p id="ss_main">xx</p>
        <p id="ss_main">yy</p>
        <p id="ss_main">zz</p>
    </section>

您可以看到连续的<p>元素,哪些属性从ss开始。我需要的是使用xpath选择每个组的第一个<p>元素,该属性从ss开始。

因此,应该选择上面的xml <p id="ss_main">aa</p><p id="ss_main">ff</p><p id="ss_main">xx</p>

我可以编写p[starts-with(@id,'ss')],从<p>ss开始选择id为attr的所有p[starts-with(@id,'ss')][1]元素,这些元素仅选择{{1}的第一个<p>元素从id开始。

有人可以建议我一个方法如何从ss开始选择每个组的第一个<p>元素?{/ p>

2 个答案:

答案 0 :(得分:1)

这是一个可能的XPath:

//p[starts-with(@id, 'ss')][not(preceding-sibling::p[1][starts-with(@id, 'ss')])]

简要说明:

  • //p[starts-with(@id, 'ss')]:找到所有pid属性的元素以"ss"开头......
  • [not(preceding-sibling::p[1][starts-with(@id, 'ss')])]:...并且没有p属性的直接前置兄弟元素id"ss"开头

答案 1 :(得分:1)

对于这个答案,我假设您正在使用XPath 2.0并且在ss前缀之后的不同后缀(@id内容的一部分)开始一个新组。

这个XPath 2.0表达式......

p[ starts-with( @id, 'ss')]
 [ not( @id eq preceding-sibling::p[1]/@id)] 

...适用于文件......

<section>
  <p id="ss_main">aa</p>
  <p id="ss_main">bb</p>
  <p id="main">cc</p>
  <p id="main">dd</p>
  <p id="main">ee</p>
  <p id="ss_main">ff</p>
  <p id="main">gg</p>
  <p id="main">hh</p>
  <p id="main">ii</p>
  <p id="main">jj</p>
  <p id="ss_main">xx</p>
  <p id="ss_main">yy</p>
  <p id="ss_main">zz</p>
</section>

...焦点节点是section元素,解析为......

<p id="ss_main">aa</p>
<p id="ss_main">ff</p>
<p id="ss_main">xx</p>

此外,当我们将相同的表达式应用于...

<section>
  <p id="ss_main">aa</p>
  <p id="ss_DifferentGroup">bb</p>
  <p id="main">cc</p>
  <p id="main">dd</p>
  <p id="main">ee</p>
  <p id="ss_main">ff</p>
  <p id="main">gg</p>
  <p id="main">hh</p>
  <p id="main">ii</p>
  <p id="main">jj</p>
  <p id="ss_main">xx</p>
  <p id="ss_main">yy</p>
  <p id="ss_main">zz</p>
</section>

...使用相同的焦点节点,我们得到......

<p id="ss_main">aa</p>
<p id="ss_DifferentGroup">bb</p>
<p id="ss_main">ff</p>
<p id="ss_main">xx</p>