如何在XPath中选择所有节点,使其组大小高于给定值

时间:2013-06-17 15:51:05

标签: xpath

我想选择所有<mynode>元素,这些元素的值在所有元素中都会出现一定次数(例如 x )。

示例:

<root>
  <mynode>
    <attr1>value_1</attr1>
    <attr2>value_2</attr2>
  </mynode>
  <mynode>
    <attr1>value_3</attr1>
    <attr2>value_3</attr2>
  </mynode>
  <mynode>
    <attr1>value_4</attr1>
    <attr2>value_5</attr2>
  </mynode>
  <mynode>
    <attr1>value_6</attr1>
    <attr2>value_5</attr2>
  </mynode>
</root>

在这种情况下,我想要<mynode>值出现的所有attr2元素&gt; 1次( x = 1)。那么,最后两个<mynode> s。

为了达到这个目标,我必须执行哪个查询?

2 个答案:

答案 0 :(得分:1)

如果您使用的是XPath 2.0或更高版本,则以下内容将起作用:

for $value in distinct-values(/root/mynode/attr2)
return
    if (count(/root/mynode[attr2 = $value]) > 1) then
        /root/mynode[attr2 = $value]
    else ()

有关更详细的讨论,请参阅:XPath/XSLT nested predicates: how to get the context of outer predicate?

答案 1 :(得分:0)

这在普通的XPath 1.0中也是可行的(也可以在较新版本的XPath中使用);并且可能更容易阅读。想想你的问题,因为你正在寻找所有<mynode/><att2/>节点,这个节点也出现在<mynode/>之前或之后:

//mynode[attr2 = preceding::attr2 or attr2 = following::attr2]

如果<att2/>个节点也可以在其他元素中存在,并且您不想测试它们:

//mynode[attr2 = preceding::mynode/attr2 or attr2 = following::mynode/attr2]