2014-11-27 5 views
0

Я относительно новичок в xQuery. И я изо всех сил пытаюсь найти для этого рабочее решение. В принципе у меня есть следующий XML:xQuery при возврате максимального элемента

<skills> 
    <skill name="XQuery" level="2"/>, 
    <skill name="R" level="1"/>, 
    <skill name="Python" level="4"/>, 
    <skill name="Python" level="5"/>, 
    <skill name="Java" level="2"/>, 
    <skill name="C" level="2"/>, 
    <skill name="C" level="5"/> 
</skills> 

Мой ожидаемый результат:

<skill name="XQuery" level="2"/>, 
<skill name="Python" level="5"/>, 
<skill name="R" level="1"/>, 
<skill name="Java" level="2"/>, 
<skill name="C" level="5"/> 

Для всех элементов с таким же именем, я хотел бы вернуть максимальное значение.

ответ

2

Это один из способов сделать это:

let $xml := 
    <skills> 
    <skill name="XQuery" level="2"/>, 
    <skill name="R" level="1"/>, 
    <skill name="Python" level="4"/>, 
    <skill name="Python" level="5"/>, 
    <skill name="Java" level="2"/>, 
    <skill name="C" level="2"/>, 
    <skill name="C" level="5"/> 
    </skills> 

for $distinct-name in distinct-values($xml/skill/@name) 
let $skills := $xml/skill[@name = $distinct-name] 
let $max := max($skills/@level) 
return $skills[@level = $max][1] 

Это еще одно решение (с использованием XQuery 3.1):

let $xml := 
    <skills> 
    <skill name="XQuery" level="2"/>, 
    <skill name="R" level="1"/>, 
    <skill name="Python" level="4"/>, 
    <skill name="Python" level="5"/>, 
    <skill name="Java" level="2"/>, 
    <skill name="C" level="2"/>, 
    <skill name="C" level="5"/> 
    </skills> 

for $skills in $xml/skill 
group by $name := $skills/@name 
return sort($skills, function($skill) { number($skill/@level) })[last()] 
+0

, какой из двух Вы бы более эффективным? Также что делает функция ($ skill) для второго решения? –

+0

sort (...) обычно будет быстрее, но это также зависит от реализации XQuery. Для получения дополнительной информации о функции, пожалуйста, ознакомьтесь с исчерпывающей спецификацией: http://www.w3.org/TR/xpath-functions-31/#func-sort –

Смежные вопросы