繁体   English   中英

XQuery:嵌套的ifs

[英]Xquery: nested 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>

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

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM