Как посчитать каждый экземпляр различных значений в XQuery? - PullRequest
3 голосов
/ 22 декабря 2011

У меня есть XML-файл со следующими элементами и атрибутами:

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

Как получить количество 1) различных экземпляров каждого атрибута color и 2) количество для каждого отдельного экземпляра?

До сих пор я пробовал и different-values ​​() и count () и их комбинации, но безуспешно, заканчивая либо количеством различных атрибутов, либо их число, хотя я бы хотел получить и то, и другое.

Список результатов, которые я хотел бы получить, выглядел бы так:

Blue 2
Red 1

Ответы [ 2 ]

8 голосов
/ 22 декабря 2011

Этот запрос должен делать то, что вы хотите:

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

ОБНОВЛЕНИЕ: Я изменил запрос, чтобы он упорядочил результатпо значению счета.

4 голосов
/ 23 декабря 2011

Это просто выражение 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 
...