XML | XML-Schema | XPath | XSL-T | XSL-FO | XQuery | XProc | SVG |
XQuery / XQuery: Generierung von 3erGruppen
![]() |
![]() |
➪ Eine etwas komplexere XQuery-Aufgabe ist die nach Einkommen absteigend sortierte, in Dreiergruppen angeordnete und nummerierte Ausgabe von Vorname und Wohnort aller Menschen im Quelldokument.
$allemenschen ist die Liste aller Menschen im Quelldokument mit Vorname und Wohnort, nach Gehalt absteigend sortiert (Casting als xs:decimal), noch ohne Position.
$numallemenschen fügt der sortierten Liste $allemenschen eine Nummerierung hinzu.
$jederdritte generiert mit dem WHERE eine neue Liste mit jedem dritten Element aus $numallemenschen. Dies ist Ausgangsbasis für eine Iteration über jeden Node in $jederdritte, jeweils wird ein Element gruppe mit einem Attribut nr erzeugt. Innerhalb dieser Gruppe wird der vorletzte, der vorhergehende und der aktuelle Node adressiert.
<root>{
let $allemenschen
as node()+ := (for $x in /Orte/Ort/Mensch
order by xs:decimal($x/Gehalt) descending
return <m vn="{$x/vorname/text()}"
ort="{$x/../name/text()}"/>)
let $numallemenschen
as node()+ := (for $x at $p in $allemenschen
return <m nr="{$p}"
vn="{$x/@vn}"
ort="{$x/@ort}"/>)
let $jederdritte
as node()+ := (for $m at $p in
$numallemenschen where $p mod 3 = 1
return $m)
for $x at $y in $jederdritte return
<gruppe nr="{$y}">
<m1 nr="{$numallemenschen[$y*3-2]/@nr}"
vn="{$numallemenschen[$y*3-2]/@vn}"
ort="{$numallemenschen[$y*3-2]/@ort}"/>
<m2 nr="{$numallemenschen[$y*3-1]/@nr}"
vn="{$numallemenschen[$y*3-1]/@vn}"
ort="{$numallemenschen[$y*3-1]/@ort}"/>
<m3 nr="{$numallemenschen[$y*3]/@nr}"
vn="{$numallemenschen[$y*3]/@vn}"
ort="{$numallemenschen[$y*3]/@ort}"/>
</gruppe>
}
</root>
Das Ergebnis:
<root>
<gruppe nr="1">
<m1 nr="1" vn="Willi" ort="Kapstadt"/>
<m2 nr="2" vn="Stefan" ort="Neustadt"/>
<m3 nr="3" vn="Betty" ort="Kapstadt"/>
</gruppe>
<gruppe nr="2">
<m1 nr="4" vn="Nicole" ort="Neustadt"/>
<m2 nr="5" vn="Siggi" ort="Neustadt"/>
<m3 nr="6" vn="Simone" ort="Darmstadt"/>
</gruppe>
<gruppe nr="3">
<m1 nr="7" vn="Werner" ort="Darmstadt"/>
<m2 nr="8" vn="Heini" ort="Neustadt"/>
<m3 nr="9" vn="Horst" ort="Darmstadt"/>
</gruppe>
<gruppe nr="4">
<m1 nr="10" vn="Karl" ort="Darmstadt"/>
<m2 nr="11" vn="Lotte" ort="Kapstadt"/>
<m3 nr="12" vn="Ludwig" ort="Darmstadt"/>
</gruppe>
<gruppe nr="5">
<m1 nr="13" vn="Rudi" ort="Darmstadt"/>
<m2 nr="14" vn="Stefan" ort="Neustadt"/>
<m3 nr="15" vn="Susi" ort="Kapstadt"/>
</gruppe>
<gruppe nr="6">
<m1 nr="16" vn="Hugo" ort="Neustadt"/>
<m2 nr="17" vn="Rita" ort="Kapstadt"/>
<m3 nr="18" vn="Martin" ort="Kapstadt"/>
</gruppe>
<gruppe nr="7">
<m1 nr="19" vn="Liane" ort="Kapstadt"/>
<m2 nr="" vn="" ort=""/>
<m3 nr="" vn="" ort=""/>
</gruppe>
</root>
wg / 2. Mai 2021
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de