我想选择所有<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。
为了达到这个目标,我必须执行哪个查询?
答案 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]