我有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>
答案 0 :(得分:1)
这是一个可能的XPath:
//p[starts-with(@id, 'ss')][not(preceding-sibling::p[1][starts-with(@id, 'ss')])]
简要说明:
//p[starts-with(@id, 'ss')]
:找到所有p
个id
属性的元素以"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>