返回多元素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
部分,我其实不想结束。我的问题是,有什么办法可以删除它吗?我尝试过{ }
和()
,两者都不起作用。
答
下面是的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
问得好,+1。请参阅我的答案以获得解释和完整解:) – 2011-02-15 04:39:02