我有一些带有一些元素的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>
我的错误在哪里,我该如何解决?
因为你在$f
上的循环绑定到<formacion>
元素,这就是where
子句适用的地方。然后当你返回$f/curso/nombre
时,它返回所有<nombre>
元素。您需要将约束应用于<curso>
元素。
有很多方法可以做到这一点,但是在不干扰外部循环的情况下,可以消除where
子句并通过在return
语句中向XPath添加谓词来应用约束:
for $f in doc("LMSGI06.1.xml")//formacion
let $minplazas := min($f/curso/plazas)
return $f/curso[plazas = $minplazas]/nombre
另一个选择是通过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