如何计算XQuery中每个不同值的实例?

时间:2011-12-22 17:12:50

标签: xml count xquery distinct-values

我有一个包含以下元素和属性的XML文件:

<element>
<unit id="1" color="blue"/>
<unit id="2" color="blue"/>
<unit id="3" color="red"/>
</element>

如何计算1)每个属性 color 的不同出现次数和2)每个不同事件的计数?

到目前为止,我已经尝试了 distinct-values() count()及其组合,没有运气,以不同属性的数量结束或者他们的数量,虽然我想两者兼得。

我想得到的结果列表如下:

Blue 2
Red 1

2 个答案:

答案 0 :(得分:8)

此查询应该执行您想要的操作:

let $input :=
  <element>
    <unit id="1" color="blue"/>
    <unit id="2" color="blue"/>
    <unit id="3" color="red"/>
  </element>

return
  for $value in distinct-values($input/unit/@color)
  let $count := count($input/unit[@color eq $value])
  order by $count descending
  return concat($value," ",$count)

这在MarkLogic中为我生成了以下输出:

blue 2
red 1

更新:我修改了查询,因此它按计数值对结果进行排序。

答案 1 :(得分:4)

这只是一个看起来更短的XPath 2,0表达式

for $v in distinct-values(/*/*/@color)
 return
    ($v, count(index-of(/*/*/@color, $v)), '&#xA;')

根据提供的XML文档评估此XPath表达式

<element>
    <unit id="1" color="blue"/>
    <unit id="2" color="blue"/>
    <unit id="3" color="red"/>
</element>

产生了想要的正确结果

blue 2 
red 1