[英]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.