返回多元素HTML作为xquery结果

问题描述:

我有一个返回多元素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

下面是的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