2009-12-01 4 views
1

В принципе у меня есть несколько последовательностей, которые могут быть пустыми, если они пусты, то я не хочу выводить его родительский узел. Если все последовательности пусты, я не хочу содержать узел. В принципе у меня есть код похож на этот, который не работает:Xquery: inested ifs

let $a := //a 
let $b := //b 

return 
<root> 
    {if (exists($a) or exists($b)) then 
     <div id="container"> 
     {if (exists($a)) then 
      <h2>As</h2> 
      <div> 
       {for loop for $a sequence...} 
      </div> 
      else() 
      } 
      {if (exists($b)) then 
      <h2>Bs</h2> 
      <div> 
       {for loop for $b sequence...} 
      </div> 
      else() 
      } 
     </div> 
    else() 
    } 
</root> 

ответ

1

У вас есть простой синтаксической ошибки в запросе:

if (exists($a)) 
then 
    <h2>As</h2> 
    <div> 
    {for loop for $a sequence...} 
    </div> 
else 
() 

Тогдашнее положение должно быть выражение XQuery, но здесь вы имеют два выражения XQuery, узел <h2> и узел <div>.

Возвращаясь последовательность узлов фиксирует это:

if (exists($a)) 
then 
    (<h2>As</h2>, 
    <div> 
    {for loop for $a sequence...} 
    </div>) 
else 
() 

Существует ловкий трюк вы можете использовать, чтобы привести в порядок запроса несколько. Expresion if (exists(A)) then B else() эквивалентен if (A) then B else(), так как вызов булева вводится вокруг предиката. Это, в свою очередь, эквивалентно только B[A], поскольку предикат A может быть поднят.

Используя этот прием, запрос может быть написан более сжато, как:

let $a := //a 
let $b := //b 
return 
<root> 
{ 
    <div id="container"> 
    { 
    (<h2>As</h2>, 
    <div> 
    { 
     ... 
    } 
    </div>)[$a], 

    (<h2>Bs</h2>, 
    <div> 
    { 
     ... 
    }</div>)[$b]) 
    } 
    </div>[$a or $b] 
} 
</root> 
+0

Большое спасибо за решение. Ваш предикат трюк действительно очень слаб для того, чтобы поделиться этим. Хотя в eXist DB 1.4 непустая последовательность не возвращает true на свой собственный. Вы должны называть exist() на нем. – Skags