返回最大元素的xQuery

时间:2014-11-27 23:06:24

标签: xml xquery

我对xQuery比较陌生。我一直在努力为此找到一个有效的解决方案。 基本上我有以下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>

我的预期结果是:

<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"/>

对于所有具有相同名称的元素,我想返回最大值。

1 个答案:

答案 0 :(得分: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()]