1

基本上我有几个可能是空的序列,如果它们是空的,那么我不想输出它的父节点。如果所有序列都是空的,那么我不想要包含节点。基本上我有与此类似的代码,但它不起作用:

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>
4

1 回答 1

1

您的查询中有一个简单的语法错误:

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 (),因为在谓词周围引入了对 boolean 的调用。这又等同于 just B[A],因为可以提升 A 谓词。

Using this trick, the query can be written more concisely as:

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>
于 2009-12-02T17:57:31.743 回答