1

我想选择所有<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值出现 > 1 次(x = 1)的所有元素。所以,最后两个<mynode>s。

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

4

2 回答 2

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 嵌套谓词:如何获取外部谓词的上下文?

于 2013-06-17T20:05:07.087 回答
0

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

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

如果<att2/>节点也可以在其他元素中出现并且您不想测试这些:

//mynode[attr2 = preceding::mynode/attr2 or attr2 = following::mynode/attr2]
于 2013-06-18T22:26:08.030 回答