2009-12-01 57 views
1

基本上我有幾個序列可能是空的,如果它們是空的,那麼我不想輸出它的父節點。如果所有的序列都是空的,那麼我不需要包含節點。基本上我有代碼類同這一點,這不工作:Xquery:嵌套的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> 

回答

1

您在查詢中有一個簡單的語法錯誤:

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

當時的條款必須是一個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> 
+0

非常感謝您的解決方案:

使用這一招,查詢可以更簡潔的書面。您的謂詞技巧確實很光滑,謝謝分享。儘管在eXist DB 1.4中,非空序列本身並不會返回true。你必須調用exists()。 – Skags 2009-12-02 20:27:37