xQuery: связывает 2 атрибута и возвращает данные, относящиеся к указанному атрибуту - PullRequest
0 голосов
/ 24 марта 2020

У меня есть файл XML, который содержит информацию об инструкторах тренажерного зала (мониторах) и их деятельности (actividades). Я застрял, пытаясь создать запрос, который связывает атрибут кода монитора из элемента деятельностей с подробностями каждого монитора в элементе мониторов.

Точная задача, о которой идет речь, такова: «Вернуть детали каждого монитора, который Обучает операции с двумя или более другими мониторами. "

В элементе действий есть два элемента с двумя мониторами. Я могу получить их, используя следующий код:

for $test in doc("polideportivo.xml")/polideportivo/actividades/actividad/monitores 
where count($test/monitor) > 1 
return data($test/monitor/@codigo)

, который дает мне результаты атрибутов кода, которые появляются более одного раза в каждом действии:

<results>m002 m003 m004 m005</results>

Но моя проблема заключается в ссылках эти коды для кодов мониторов в элементе monitores.

Сначала я подумал о применении приведенного выше кода к переменной с помощью let, но он показывает все атрибуты деятельности, а не только те, которые имеют 2 или более.

Может ли кто-нибудь указать мне правильное направление?

Ниже я оставлю фрагмент XML:

<polideportivo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="polideportivo.xsd">
<monitores>
  <monitor codigo="m001">
    <nombre>Mario</nombre>
    <apellidos>Cansado Pérez</apellidos>
    <telefono>968222222</telefono>
    <salario>1200</salario>
  </monitor>
  <monitor codigo="m002">...</monitor>
  <monitor codigo="m003">...</monitor>
  <monitor codigo="m004">...</monitor>
  <monitor codigo="m005">...</monitor>
</monitores>
<actividades>
  <actividad codigo="a10">
   <nombre>Pilates</nombre>
   <duracion>55</duracion>
   <intensidad>Ligero</intensidad>
   <lugar>Sala Fitness</lugar>
   <horario>...</horario>
   <monitores>
    <monitor codigo="m001"/>
   </monitores>
</actividad>
<actividad codigo="a20">
   <nombre>Crosstraining</nombre>
   <duracion>55</duracion>
   <intensidad>Fuerte</intensidad>
   <lugar>Sala Fitness</lugar>
   <horario>
    <sesion>
     <día>Martes</día>
     <horas>
      <hora>10:00</hora>
      <hora>16:00</hora>
      <hora>20:00</hora>
    </horas>
   </sesion>
  </horario>
   <monitores>
    <monitor codigo="m002"/>
    <monitor codigo="m003"/>
   </monitores>
</actividad>

1 Ответ

0 голосов
/ 24 марта 2020

Похоже,

/*/monitores/monitor[
   some $actividad in /*/actividades/actividad 
   satisfies 
     ($actividad/monitores/monitor/@codigo = @codigo 
      and $actividad/monitores/monitor[2])]

- это выражение XPath 2 и более поздние (и, следовательно, также XQuery 1 и более поздние), которое выражает ваше словесное описание (я не уверен, хотите ли вы проверить наличие двух или больше или по крайней мере два монитора, образец проверяет по крайней мере два.

...