2011-02-14 90 views
2

我有一個返回多元素HTML結果的問題(我不知道這個名字)。爲了更清楚,請參閱下面的代碼。返回多元素HTML作爲xquery結果

<body> 
    <h1>Nobel prize winners</h1>{ 
    for $subject in distinct-values(doc("nobel.xml")//subject) 
    let $sn := $subject` 
    return <div><h2>{$sn}</h2><ul> 
     {for $row in doc("nobel.xml")/nobel/row 
      let $name := $row/winner/text() 
      let $year := $row/yr/text() 
      where $row/subject/text()=$subject 
      order by $year 
      return <li> ({$year} {$name} </li> 
     }</ul></div> 
    } 
</body> 

該代碼的工作,但你可以看到,我已經把在一開始就知道<div></div>return部分,我其實不想結束。我的問題是,有什麼辦法可以刪除它嗎?我嘗試過{ }(),兩者都不起作用。

+0

問得好,+1。請參閱我的答案以獲得解釋和完整解:) – 2011-02-15 04:39:02

回答

4

下面是的XQuery 1.0的語法的語法規則,如從XQuery 1.0 w3c spec採取:

[31] Expr   ::= ExprSingle ("," ExprSingle)* 
[32] ExprSingle ::= FLWORExpr 
          | QuantifiedExpr 
          | TypeswitchExpr 
          | IfExpr 
          | OrExpr 
[33] FLWORExpr ::= (ForClause | LetClause)+ WhereClause? 
              OrderByClause? "return" ExprSingle 

可以清楚地看出,return令牌(關鍵字)必須遵循由單個表達。

然而,擺脫div元素你有

<body> 
    <h1>Nobel prize winners</h1> 
    { 
    for $subject in 
      distinct-values(doc("nobel.xml")//subject) 
     let $sn := $subject 
     return 
      <h2>{$sn}</h2> 
       <ul> 
        {for $row in doc("nobel.xml")/nobel/row 
        let $name := $row/winner/text() 
        let $year := $row/yr/text() 
        where $row/subject/text()=$subject 
        order by $year 
         return 
         <li> ({$year} {$name} </li> 
        } 
       </ul> 
     } 
</body> 

我們可以清楚地看到,return關鍵字後面沒有一個單一的表達,通過的XQuery 1.0定義語法。

:清楚地指定跟隨return關鍵字元素的序列,如序列:

<body> 
    <h1>Nobel prize winners</h1> 
    { 
    for $subject in 
      distinct-values(doc("nobel.xml")//subject) 
     let $sn := $subject 
     return 
      (
      <h2>{$sn}</h2>, 
       <ul> 
        {for $row in doc("nobel.xml")/nobel/row 
        let $name := $row/winner/text() 
        let $year := $row/yr/text() 
        where $row/subject/text()=$subject 
        order by $year 
         return 
         <li> ({$year} {$name} </li> 
        } 
       </ul> 
     ) 
     } 
</body> 

通知,繼return元件的序列現在由括號包圍,並且所述序列中的元素由逗號分隔。現在

,當這個nobel.xml文件執行上面的XQuery代碼:

<nobel> 
<row> 
    <subject>Lit</subject> 
    <winner>Solzhenitsin</winner> 
    <yr>1969</yr> 
</row> 
</nobel> 

想要的,正確的結果產生:

<body> 
    <h1>Nobel prize winners</h1> 
    <h2>Lit</h2> 
    <ul> 
     <li> (1969Solzhenitsin</li> 
    </ul> 
</body> 
+0

這是偉大的...我沒有注意到,我們應該把逗號定義序列... – zfm 2011-02-15 09:20:55