В вашем запросе есть простая синтаксическая ошибка:
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>