Xquery: вложенные ifs - PullRequest
       9

Xquery: вложенные ifs

1 голос
/ 02 декабря 2009

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

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 Ответ

1 голос
/ 02 декабря 2009

В вашем запросе есть простая синтаксическая ошибка:

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

Предложение then должно быть выражением XQuery, но здесь у вас есть два выражения XQuery, узел <h2> и узел <div>.

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

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

Существует несколько хитростей, которые вы можете использовать, чтобы немного привести в порядок запрос. Выражение 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>
...