Was ist XQuery? / Arbeiten mit Variablen

Arbeiten mit Variablen

Arbeiten mit Variablen

Zur effizienten Speicherung sehr zahlreicher XML-Dokumente bieten sich sowohl native XML-Datenbanken als auch herkömmliche SQL-Datenbanken an, die das Abspeichern als XML-Dokument ermöglichen. Zur Auswertung der dort gelisteten XML-Dokumente innerhalb dieser Technologien kommt häufig XQuery zum Einsatz.

Mitunter ist es in XQuery notwendig, Zwischenergebnisse in temporäre Variablen auszulagern, bevor sie weiter verarbeitet werden können. Das kann bei der Numerierung 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 (also ohne das Root-Element "erg"):


  <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 Sequenzvariable "$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 Endetag "WERT") ausgegeben. Würde der Aufruf dagegen "{$y}" lauten, dann enthielte das Ergebnis auch die Start- und Endetags 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>

Variable als anonyme Funktionen

Wie unter , besteht auch in XQuery die Möglichkeit, einer Variablen eine anonyme Funktion zuzuweisen.

Obwohl auch hier nicht zwingend erforderlich, ist die präzise empfehlenswert.


<erg>
{
  let $myfunc := function($x as xs:integer) 
             as xs:integer
             {$x * 2}
  for $yy in (1 to 10)
  return
    <quadriert wert="{$yy}">{$myfunc($yy)}</quadriert>
}
</erg>

Das Ergebnis sieht nachvollziehbar aus:


<erg>
   <quadriert wert="1">2</quadriert>
   <quadriert wert="2">4</quadriert>
   <quadriert wert="3">6</quadriert>
   <quadriert wert="4">8</quadriert>
   <quadriert wert="5">10</quadriert>
   <quadriert wert="6">12</quadriert>
   <quadriert wert="7">14</quadriert>
   <quadriert wert="8">16</quadriert>
   <quadriert wert="9">18</quadriert>
   <quadriert wert="10">20</quadriert>
</erg>

wg / 4. Januar 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







Vielen Dank für Ihr Interesse an meiner Arbeit.


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

Mobil: 0151. 750 360 61 * eMail: info2018@wilfried-grupe.de

www.wilfried-grupe.de/XQuery4.html