如何使用LET和WHERE获取元素的名称?

问题描述 投票:1回答:2

我有一些带有一些元素的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>

我的错误在哪里,我该如何解决?

xml xpath xquery
2个回答
3
投票

因为你在$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

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
© www.soinside.com 2019 - 2024. All rights reserved.