首页 > 解决方案 > xQuery:关联 2 个属性并返回与所述属性相关的数据

问题描述

我有一个 XML 文件,其中包含有关健身房教练(监视器)和他们教授的活动(actividades)的信息。我一直在尝试创建一个查询,该查询将活动元素中的监视器代码属性与监视器元素中每个监视器的详细信息相关联。

有问题的确切任务是:“返回每个监视器的详细信息,该监视器使用 2 个或更多其他监视器教授活动。”

在活动元素中,有两个元素具有 2 个监视器。我可以使用以下代码获取这些:

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>

标签: attributesxquery

解决方案


看起来像

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

是 XPath 2 及更高版本(也是 XQuery 1 及更高版本)表达式,用于表达您的口头描述(我不确定您是否要检查两个或更多或至少两个监视器,示例检查至少两个.


推荐阅读