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;')

この XPath 式が提供された XML ドキュメントに対して評価されると、次のようになります。

<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 に答える