/ / retourne le HTML multi-éléments en tant que résultat xquery - html, xquery, transformation

retourne le HTML multi-élément en tant que résultat xquery - html, xquery, transformation

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 № 1

Voici 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>