/ / powracający wieloelementowy HTML jako wynik xquery - html, xquery, transformation

zwracanie wieloelementowego HTML jako wyniku xquery - html, xquery, transformation

Mam problem z zwracaniem wieloelementowego wyniku HTML (nie znam jego nazwy). Aby było wyraźniej, zobacz poniższy kod.

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

Ten kod zadziała, ale możesz zauważyć, że muszę to powiedzieć <div> i </div> na początku i na końcu return część, której tak naprawdę nie chcę.Moim jest pytanie, czy istnieje sposób na jej usunięcie? { } i ( ) i oba nie działają.

Odpowiedzi:

4 dla odpowiedzi № 1

Oto zasada składni dla gramatyki XQuery 1.0, jak wzięto z XQuery 1.0 w3c spec.:

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

Jak można wyraźnie zauważyć, return token (słowo kluczowe) musi być poprzedzone pojedynczym wyrażeniem.

Jednak, pozbywając się div element, który masz:

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

Jak możemy wyraźnie zobaczyć, return słowu kluczowemu nie towarzyszy pojedyncze wyrażenie, zgodnie z definicją gramatyki XQuery 1.0.

Rozwiązanie: Wyraźnie określ sekwencję elementów następujących po return słowo kluczowe jako sekwencja:

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

Ogłoszenie następująca sekwencja elementów return jest teraz otoczony nawiasami, a elementy w sekwencji są rozdzielane przecinkiem.

Teraz, gdy powyższy kod XQuery jest wykonywany na tym nobel.xml plik:

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

pożądany, prawidłowy wynik jest wytwarzany:

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