J'ai un problème avec le retour du résultat HTML multi-éléments (je ne connais pas le nom pour cela). Pour le rendre plus clair, veuillez consulter le code ci-dessous.
<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>
Ce code fonctionnera, mais vous pouvez remarquer que je dois le mettre <div>
et </div>
au début et à la fin de la return
partie, ce que je ne veux pas réellement. Ma question est, y at-il un moyen de le supprimer? J'ai essayé avec { }
et ( )
et les deux ne fonctionnent pas.
Réponses:
4 pour la réponse № 1Voici la règle de syntaxe pour la grammaire de XQuery 1.0, prise à partir du XQuery 1.0 w3c spec.:
[31] Expr ::= ExprSingle ("," ExprSingle)*
[32] ExprSingle ::= FLWORExpr
| QuantifiedExpr
| TypeswitchExpr
| IfExpr
| OrExpr
[33] FLWORExpr ::= (ForClause | LetClause)+ WhereClause?
OrderByClause? "return" ExprSingle
Comme on peut le voir clairement, le return
token (mot-clé) doit être suivi d'une expression unique.
Cependant, en se débarrassant de la div
élément que vous avez:
<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>
Comme on peut clairement voir, le return
le mot clé n'est pas suivi par une seule expression, comme défini par la grammaire XQuery 1.0.
Solution: Spécifiez clairement la séquence des éléments qui suivent le return
mot clé, en séquence:
<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>
Remarquer que la suite des éléments suivants return
est maintenant entouré de parenthèses et que les éléments de la séquence sont délimités par une virgule.
Maintenant, quand le code XQuery ci-dessus est exécuté sur ce nobel.xml
fichier:
<nobel>
<row>
<subject>Lit</subject>
<winner>Solzhenitsin</winner>
<yr>1969</yr>
</row>
</nobel>
le résultat recherché est produit:
<body>
<h1>Nobel prize winners</h1>
<h2>Lit</h2>
<ul>
<li> (1969Solzhenitsin</li>
</ul>
</body>