6

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

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

如何获得 1) 每种属性颜色的不同出现次数和 2) 每种不同出现次数的计数?

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

我想获得的结果列表如下所示:

Blue 2
Red 1
4

2 回答 2

12

这个查询应该做你想做的事:

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

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

于 2011-12-22T18:34:37.320 回答
6

这只是一个看起来更短的 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 
于 2011-12-23T02:50:48.797 回答