Xquery,将数组中的元素与下一个元素进行比较

时间:2016-03-25 02:07:28

标签: arrays compare xquery

拥有一个具有不同值的数组,我怎样才能在一个查询中比较两个共享相同条件并且彼此相邻的元素,对不好的英语抱歉,这不是我的母语 这是xml:

<prac1516>
    <torns>
        <torn codi="A" nom="Matí" preu="100" />
        <torn codi="B" nom="Tarda" preu="150" />
        <torn codi="C" nom="Nit" preu="200" />
    </torns>

    <tipus>
        <espec id="e1" torn="C">Musica</espec>
        <espec id="e2">Cine</espec>
        <espec id="e3" torn="B">Xerrada</espec>
        <espec id="e4">Festa Infantil</espec>
    </tipus>

    <clients>
        <client id="1">Marti</client>
        <client id="2">Jana</client>
        <client id="3">Edu</client>
        <client id="4">Berta</client>
        <client id="5">Laia</client>    
        <client id="6">Santi</client>
        <client id="7">Pau</client>
        <client id="8">Mia</client> 
    </clients>

    <calendari>
        <reserva client="1" data="2016-01-01" torn="A" espec="e2" />
        <reserva client="2" data="2016-01-01" torn="B" espec="e3" />
        <reserva client="3" data="2016-01-02" torn="C" espec="e3" />
        <reserva client="4" data="2016-01-03" torn="A" espec="e2" />
        <reserva client="4" data="2016-01-03" torn="B" espec="e4" />
        <reserva client="2" data="2016-01-03" torn="C" espec="e4" />
        <reserva client="8" data="2016-01-04" torn="A" espec="e3" />
        <reserva client="4" data="2016-01-04" torn="C" espec="e3" />
        <reserva client="3" data="2016-01-05" torn="A" espec="e1" />
        <reserva client="7" data="2016-01-05" torn="B" espec="e1" />
        <reserva client="2" data="2016-01-06" torn="A" espec="e1" />
        <reserva client="1" data="2016-01-06" torn="B" espec="e2" />
        <reserva client="3" data="2016-01-06" torn="B" espec="e2" />
        <reserva client="4" data="2016-01-08" torn="B" espec="e3" />
        <reserva client="7" data="2016-01-08" torn="C" espec="e2" />
        <reserva client="8" data="2016-01-09" torn="A" espec="e2" />
        <reserva client="9" data="2016-01-09" torn="B" espec="e4" />
        <reserva client="2" data="2016-01-09" torn="C" espec="e4" />
        <reserva client="2" data="2016-01-10" torn="A" espec="e3" />
        <reserva client="1" data="2016-01-10" torn="B" espec="e2" />
        <reserva client="1" data="2016-01-10" torn="C" espec="e1" />
    </calendari>

</prac1516>

我希望看到撕裂的一个日期(数据),然后是撕裂的B,或撕裂的B,之后是撕裂的C

我认为这会做我想要的,但不是! :

let $w :=
  for $x in //reserva
  let $d := //reserva/@data
  return $d
for $r in (1 to 21)
where (//reserva[@data=$w[$r]]/@torn='A' and  //reserva[@data=$w[$r+1]]/@torn='B') or (//reserva[@data=$w[$r]]/@torn='B'and  //reserva[@data=$w[$r+1]]/@torn='C')
return $w[$r]

1 个答案:

答案 0 :(得分:1)

您可以使用reserva获取下一个following-sibing::reserva[1]元素,如下所示:

for $r in //reserva
let $next_r := $r/following-sibling::reserva[1]   
where 
    ($r/@torn eq 'A' and $next_r/@torn eq 'B')
        or
    ($r/@torn eq 'B' and $next_r/@torn eq 'C')
return $r/@data