Как я могу получить имя элемента, используя LET и WHERE? - PullRequest
1 голос
/ 25 апреля 2019

У меня есть 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>

Мне нужно вернуть курс (курс), чтобы он имел минимальное количество мест (площадей), и в этом примере курс с меньшим количеством мест 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 ]

3 голосов
/ 25 апреля 2019

Поскольку ваш цикл на $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 голос
/ 26 апреля 2019

Другой вариант - отсортировать элементы 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
...