使用Xquery的元素计数

时间:2018-09-13 09:10:36

标签: xquery

我需要提取出现次数最多的那个元素的计数,例如在下面的xml中,我需要将计数返回为2,这是针对Email元素的。

<root>
   <_1>
      <attributes>
         <Email>
            <ov>true</ov>
            <value>
               <Email>
                  <ov>true</ov>
                 <value>abc@hghh.gff</value>
               </Email>
            </value>
         </Email>
         <Email>
            <ov>true</ov>
            <value>
               <Email>
                  <ov>true</ov>
                  <value>xyn@qwe.com</value>
               </Email>
            </value>
         </Email>
         <UniqueId>
            <ov>true</ov>
            <value>39919741</value>
         </UniqueId>
      </attributes>
   </_1>
</root>

2 个答案:

答案 0 :(得分:1)

好吧,选择您感兴趣的元素,将它们按node-name()分组,按count进行分组,然后按降序排列第一个,或按升序排列最后一个,例如

for $element in outermost((//Email, //UniqueId))
group by $name := node-name($element)
order by count($element) descending
count $pos
where $pos = 1
return $name || ' : ' || count($element)

在示例输出Email : 2上运行时。

示例https://xqueryfiddle.liberty-development.net/6qM2e2c

答案 1 :(得分:0)

另一种方法是使用https://www.w3.org/TR/xpath-functions-31/#highest-lowest中的eg:highest()高阶函数,然后将其应用于选定的节点$ E组,如下所示:

let $E := (:the selected elements:)
return eg:highest(distinct-values($E!node-name()), 
                  function($n){count($E[node-name() eq $n])})

eg:highest($seq, $f)函数是一种通用的高阶函数,可在$seq中查找所提供函数$f中具有最高值的项目。