Количество элементов с использованием Xquery - PullRequest
0 голосов
/ 13 сентября 2018

Мне нужно извлечь счетчик того элемента, который имеет максимальное количество вхождений. Например, в приведенном ниже XML-файле мне нужно, чтобы значение count было возвращено как 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 голосов
/ 13 сентября 2018

Другой подход - использовать функцию высшего порядка eg:highest(), найденную в https://www.w3.org/TR/xpath-functions-31/#highest-lowest,, а затем применить ее к выбранному набору узлов $ 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.

0 голосов
/ 13 сентября 2018

Итак, выберите интересующие вас элементы, сгруппируйте их по 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

...