2

使用 XPath 或 XQuery,我如何选择另一个节点出现次数最多的节点?

例如,我如何找到鸡蛋最多的篮子?

<basket name="1">
        <egg></egg>
        <egg></egg>
</basket>
<basket name="2">
        <egg></egg>
</basket>
<basket name="3">
        <egg></egg>
        <egg></egg>
        <egg></egg>
        <egg></egg>
</basket>
4

3 回答 3

3

这是一种解决方案(TIMTOWTDI):

let $nodes := <xml>
  <basket name="1">
          <egg></egg>
          <egg></egg>
  </basket>
  <basket name="2">
          <egg></egg>
  </basket>
  <basket name="3">
          <egg></egg>
          <egg></egg>
          <egg></egg>
          <egg></egg>
  </basket>
</xml>
let $max := max(for $c in $nodes//basket return count($c/egg))
return $nodes/basket[count(egg) = $max]
于 2012-12-02T20:11:37.683 回答
1

这既是一个 XPath 2.0 表达式,也是一个 XQuery,用于选择想要的元素

/*/basket[egg[max(/*/basket/count(egg))]]

基于 XSLT 2.0 的验证

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:sequence select="/*/basket[egg[max(/*/basket/count(egg))]]"/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档(您提供的 XML 片段,包装到单个顶部元素中以成为格式良好的 XML 文档)时:

<t>
    <basket name="1">
        <egg></egg>
        <egg></egg>
    </basket>
    <basket name="2">
        <egg></egg>
    </basket>
    <basket name="3">
        <egg></egg>
        <egg></egg>
        <egg></egg>
        <egg></egg>
    </basket>
</t>

计算 XPath 表达式并将计算结果复制到输出

<basket name="3">
        <egg/>
        <egg/>
        <egg/>
        <egg/>
    </basket>

请注意

没有“另一个节点出现次数最多的节点”这样的东西

事实上,根据实际的 XML 文档,可能有许多元素包含相同的最大数量的其他元素。

如果您只想获得一个这样的元素,请按文档顺序说第一个,然后使用

/*/basket[egg[max(/*/basket/count(egg))]][1]
于 2012-12-02T22:06:16.983 回答
0
<xml>
    <basket name="1">
        <egg></egg>
        <egg></egg>
    </basket>
    <basket name="2">
        <egg></egg>
    </basket>
    <basket name="3">
        <egg></egg>
        <egg></egg>
        <egg></egg>
        <egg></egg>
    </basket>
</xml>

你可以尝试这样的 XPath

xml/basket[
    count(egg) > count(following-sibling::*/egg) and
    count(egg) > count(preceding-sibling::*/egg)
]

或者如果您不仅要计算鸡蛋元素

xml/basket[
    count(child::*) > count(following-sibling::*/child::*) and
    count(child::*) > count(preceding-sibling::*/child::*)
]
于 2012-12-02T20:26:38.583 回答