我有一个xml
,其中包含一些元素:
<tienda>
<formacion>
<curso id="1">
<nombre>Android</nombre>
<plazas>20</plazas>
</curso>
<curso id="2">
<nombre>iOS</nombre>
<plazas>15</plazas>
</curso>
<curso id="3">
<nombre>SEM / SEO</nombre>
<plazas>55</plazas>
</curso>
<curso id="4">
<nombre>Photoshop</nombre>
<plazas>10</plazas>
</curso>
<curso id="5">
<nombre>RPAS</nombre>
<plazas>5</plazas>
</curso>
</formacion>
</tienda>
我需要返回课程(curso),该课程具有最少的名额(广场),在此示例中,名额较少的课程是 RPAS ,因为它有5个<plazas>5</plazas>
。
我已经开发了这个xquery句子:
for $f in doc("LMSGI06.1.xml")//formacion
let $minplazas := min($f/curso/plazas)
where $f/curso/plazas = $minplazas
return $f/curso/nombre
但是此代码未检索到我<plazas>5</plazas>
,而是返回了我:
<nombre>Android</nombre>
<nombre>iOS</nombre>
<nombre>SEM / SEO</nombre>
<nombre>Photoshop</nombre>
<nombre>RPAS</nombre>
我的错误在哪里,我该如何解决?
答案 0 :(得分:3)
因为您在$f
上的循环绑定到<formacion>
元素,所以where
子句就在这里应用。然后,当您返回$f/curso/nombre
时,它将返回所有<nombre>
元素。您需要将约束应用于<curso>
元素。
有很多方法可以做到这一点,但是在不干扰外部循环的情况下,您可以通过在where
语句中向XPath添加谓词来消除return
子句并应用约束:>
for $f in doc("LMSGI06.1.xml")//formacion
let $minplazas := min($f/curso/plazas)
return $f/curso[plazas = $minplazas]/nombre
答案 1 :(得分:1)
另一种选择是将curso
元素按plazas
排序(视为整数),然后简单地返回第一项的nombre
:
(for $curso in tienda/formacion/curso
order by $curso/xs:integer(plazas)
return $curso/nombre)[1]
https://xqueryfiddle.liberty-development.net/jyyiVhu/1
在具有高级功能支持的XQuery 3中,您甚至可以将sort
函数与例如
sort(tienda/formacion/curso, (), function($c) { xs:integer($c/plazas) })[1]/nombre