Was ist XQuery? / Arbeiten mit Variablen

Arbeiten mit Variablen

Arbeiten mit Variablen

➪ Mitunter ist es in XQuery notwendig, Zwischenergebnisse in temporäre Variablen auszulagern, bevor sie weiterverarbeitet werden können. Das kann bei der Nummerierung einer Sequenz notwendig werden, die vorher mit order by sortiert wurde.


<erg>
{
  let $tmp := for $x in ((1 to 10)[. mod 3 = 0], 'Holzflos')
  order by $x descending
  where $x castable as xs:decimal
  return 
    <WERT>     
      {$x}
    </WERT>
  for $y at $p in $tmp return
    <zahl lfdnr="{$p}">{$y/text()}</zahl>
}
</erg>

$tmp ist eine solche temporäre Sequenz-Variable, deren Inhalt in diesem Beispiel so aussieht:


  <WERT>9</WERT>
  <WERT>6</WERT>
  <WERT>3</WERT>

Im nächsten Schritt wird mit for $y at $p in $tmp jedes einzelne Item der Sequenzvariablen $tmp verarbeitet. Dabei entspricht $y jedem einzelnen Item (also z.B. <WERT>9</WERT>); $p stellt die Position dieses Items in der Sequenz dar. Ergebnis:


<erg>
  <zahl lfdnr="1">9</zahl>
  <zahl lfdnr="2">6</zahl>
  <zahl lfdnr="3">3</zahl>
</erg>

Wichtig ist dabei, den Aufruf {$y/text()} zu verstehen. Damit wird der Textinhalt (also der Textnode zwischen dem Start- und Ende-Tag WERT) ausgegeben. Würde der Aufruf dagegen {$y} lauten, dann enthielte das Ergebnis auch die Start- und Ende-Tags von $y:


<erg>
  <zahl lfdnr="1">
    <WERT>9</WERT>
  </zahl>
  <zahl lfdnr="2">
    <WERT>6</WERT>
  </zahl>
  <zahl lfdnr="3">
    <WERT>3</WERT>
  </zahl>
</erg>

Ebenfalls ein Beispiel für die Arbeit mit Variablen finden Sie in der Auswertung folgender XML-Struktur (kurzgefasst).


<ROOT>
  <Ort>
    <id>1</id>
    <name>Neustadt</name>
  </Ort>  
  <Mensch>
    <id>1</id>
    <name>Holzflos</name>
    <vorname>Hugo</vorname>
    <Gehalt>234.56</Gehalt>
    <idOrt>1</idOrt>
  </Mensch>  
  <Ware>
    <id>1</id>
    <bez>Hemd</bez>
    <preis>12.99</preis>
  </Ware>
  <Kauf>
    <id>1</id>
    <anzahl>3</anzahl>
    <idMensch>1</idMensch>
    <idWare>1</idWare>
  </Kauf>
</ROOT>

Das folgende XQuery-Script definiert eine Variable $verg, in der die Zielstruktur bereits im Wesentlichen enthalten ist. Was noch fehlt, ist die Nummerierung der Einzelergabnisse.


xquery version '3.0';
declare variable $verg := for $o in /ROOT/Ort return
  for $m in /ROOT/Mensch[idOrt = $o/id] return
    for $w in /ROOT/Ware return
      for $k in /ROOT/Kauf[idMensch = $m/id]
                          [idWare = $w/id] return
        <ds
          ort="{$o/name}"
          NN="{$m/name}"
          VN="{$m/vorname}"
          Art="{$w/bez}"
          anzahl="{$k/anzahl}"/>;

Diese Nummerierung wird über $p generiert.


<ergebnis>
  {
    for $w at $p in $verg
    return
      <ds nr="{$p}">{
          for $wa in $w/attribute::*
          return $wa
        }
      </ds>  
  }
</ergebnis>

Das (ebenso kurzgefasste) Resultat ist dann:


<?xml version="1.0" encoding="UTF-8"?>
<ergebnis>
   <ds nr="1"
       ort="Neustadt"
       NN="Holzflos"
       VN="Hugo"
       Art="Hemd"
       anzahl="3"/>
</ergebnis

wg / 14. Juli 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XQuery4.html