Xml 关于返回最大元素的xQuery

Xml 关于返回最大元素的xQuery,xml,xquery,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=

我对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"/>
,
,
,
,

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

这是一种方法:

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]
let$xml:=
,
,
,
,
,
,
对于不同值中的$distinct name($xml/skill/@name)
让$skills:=$xml/skill[@name=$distinct name]
设$max:=max($skills/@level)
返回$skills[@level=$max][1]
这是另一个解决方案(使用XQuery 3.1):

let$xml:=
,
,
,
,
,
,
对于$xml/skill中的$skills
按$name分组:=$skills/@name
返回排序($skills,function($skill){number($skill/@level)})[last()]

< /代码>你认为哪两个更有效率?函数($skill)对第二个解决方案做了什么?排序(…)通常会更快,但这也取决于XQuery实现。有关该功能的更多信息,请查看综合规范:
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()]