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

时间:2019-04-25 19:26:12

标签: xml xpath xquery

我有一个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>

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

2 个答案:

答案 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