Einführung in die XML-Technologien XPath, XSLT und XQuery/XQuery

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>XQuery</language>
Autoren
* Fred Teske([mailto:s3frtesk@stud.hs-zigr.de s3frtesk@stud.hs-zigr.de  ])
* Philipp Dvorak ([mailto:s3phdvor@stud.hs-zigr.de s3phdvor@stud.hs-zigr.de])



=Einstieg in XQuery=

XQuery ist ein Abfragesprache für XML. Welche vom W3C entwickelt wurde. In diesem Kurs sollen die grundlegenden Spracheigenschaften vorgestellt werden und ein Verständnis der Syntax und Struktur von XQuery – Ausdrücken vermittelt werden.

XQuery ermöglicht:

* das Auswählen von Elementen und Attributen
* das Zusammenführen mehrerer XML-Dokumente
* das Bearbeiten von XML-Daten
* das Hinzufügen von Elementen und Attributen zu der Ergebnismengen
* Berechnungen auf Grundlage von XML-Daten
* Sortierungen der Ergebnismenge


Die Empfehlungen vom W3C für XQuery und XPath überschneiden sich. XPath bildet eine Untermenge von XQuery. Somit ist jeder gültige XPath - Ausdruck auch ein gültiger XQuery - Ausdruck.


[[Bild:XQuery.jpg|450px]]


Folgendes XML-Dokument soll als Basis für Beispiele und Erläuterungen dienen.

<popup name = "Beispieldokument">
<code id="4ef327a06604d">
<filmliste>

<film genre="Science-Fiction">
    <titel>Die Rueckkehr der Jedi-Ritter</titel>
    <hauptrollen>
       <schauspieler>Harrison Ford</schauspieler>
       <schauspieler>Mark Hamill</schauspieler>
    </hauptrollen>
    <oscars>1</oscars>
    <regie>
        <regisseur>Richard</regisseur>
    </regie>
    <jahr>1983</jahr>
</film>
    
<film genre="Thriller">
    <titel>Sin City</titel>
    <hauptrollen>
        <schauspieler>Jessica Alba</schauspieler>
        <schauspieler>Rosario Dawson</schauspieler>
        <schauspieler>Elijah Wood</schauspieler>
        <schauspieler>Bruce Willis</schauspieler>
    </hauptrollen>
        <oscars>0</oscars>
        <regie>
           <regisseur>Frank Miller</regisseur>
           <regisseur>Robert Rodriguez</regisseur>
           <regisseur>Quentin Tarantino</regisseur>
        </regie>
    <jahr>2005</jahr>   
</film>
    
<film genre="Drama">
        <titel>Forrest Gump</titel>
        <hauptrollen>
            <schauspieler>Tom Hanks</schauspieler>
        </hauptrollen>
        <oscars>6</oscars>
        <regie>
            <regisseur>Robert Zemeckis</regisseur>
        </regie>
        <jahr>1994</jahr>
</film>
    
<film genre="Action">
        <titel>The Dark Knight</titel>
        <hauptrollen>
            <schauspieler>Christian Bale</schauspieler>
            <schauspieler>Heath Ledger</schauspieler>
            <schauspieler>Aaron Eckhart</schauspieler>
        </hauptrollen>
        <oscars>2</oscars>
        <regie>
            <regisseur>Christopher Nolan</regisseur>
        </regie>
        <jahr>2008</jahr>
</film>
    
<film genre="Science-Fiction">
        <titel>Avatar</titel>
        <hauptrollen>
            <schauspieler>Sam Worthington</schauspieler>
            <schauspieler>Zoe Saldana</schauspieler>
        </hauptrollen>
        <oscars>3</oscars>
        <regie>
            <regisseur>James Cameron</regisseur>
        </regie>
        <jahr>2009</jahr>
</film>

</filmliste>

</code>
</popup>



<language>XQuery</language>
=FLWOR - Ausdrücke=

FLWOR - Ausdrücke bilden die Grundlage für Anfragen an XML - Dokumente. Der Ausdruck bindet Variablen an Ergebnisse von Ausdrücken, wertet darauf in einer where-Klausel ein Prädikat aus und konstruiert ein neues Dokument als Resultat. FLWOR - Ausdrücke weisen Ähnlichkeiten mit Abfragen im SQL - Syntax auf. FLWOR ist ein Kunstwort (aus dem englischen "Flower"). Die einzelnen Buchstaben entsprechen dabei den Anfangsbuchstaben der Klauseln des Ausdrucks: for, let, where, order und return.


Ein einfacher FLWOR - Ausdruck ist zum Beispiel folgendes:

<run id="4ef330571dd87">
for $v in //filmliste/film
return $v/titel
</run>


Dieser Ausdruck gibt alle Filmtitel aus dem Beispiel XML-Dokument "filmliste" zurückgeben.

Mit einer zusätzlichen where Klausel kann die Ergebnismenge weiter eingegrenzt werden.


<run id="4ef330571ddf5">
for $v in //filmliste/film
where $v/jahr = 2009
return $v/titel
</run>


Die gleiche Abfrage könnte auch mit Hilfe des XPath - Ausdrucks /filmliste/film[jahr=2009]/titel ausgeführt werden. Der XPath - Ausdruck liefert genau die selbe Ergebnismenge wie der XQuery - Ausdruck. Es gilt jeder gültige XPath - Ausdruck ist auch in XQuery zulässig. Jedoch sind FLWOR - Ausdrücke in XQuery weitaus leistungsfähiger wenn es darum geht mit Hilfe von JOINS Abfragen über mehrere XML-Dokumente auszuführen.







==Die for-Klausel==

In der for-Klausel wird über eine Sequenz iteriert. Es handelt sich entweder um eine Sequenz von Knoten oder um eine Sequenz aus atomaren Werten. Es kann eine beliebige Operation auf alle Elemente der Sequenz angewendet werden.



<run id="4ef344c255b35">
for $i in (1 to 10)
return $i * $i
</run>

Bei $i handelt es sich um die Iterationsvariable, welche jeden Wert der Sequenz einmal annimmt. Es ist mehr als eine for-Klausel pro Ausdruck möglich. 

Ein FLWOR - Ausdruck kann an jeder beliebigen stelle stehen an der ein Ausdruck erlaubt ist. Beispielsweise kann ein FLWOR - Ausdruck als Argument an eine Funktion übergeben werden.
Die Funktion avg() berechnet den Durchschnitt aus der Sequenz, welche der FLWOR - Ausdruck zurückgibt. Im Beispiel wird die durchschnittliche Anzahl der Schauspieler, die eine Hauptrolle spielen berechnet.


<run id="4ef35549842be">
avg(
    for $v in //filmliste/film/hauptrollen
    return count($v/schauspieler)
)
</run>




==Die let-Klausel==

Mit Hilfe der Let-Klausel ist es möglich Variablen zu deklarieren. Im Gegensatz zur for – Klausel, in der die Listenelemente durchlaufen werden, ist in der let – Klausel die Variable immer an das Element gebunden. Das kann ein atomarer Wert sein oder eine Sequenz. Der Wert der Variablen, welche mit let deklariert wurde, wird in jedem Schleifendurchlauf neu belegt.


<run id="4ef385fdaa212">
for $i in (1, 2, 3)
let $j := (1, 2, 3)
return 
<eval><i>{ $i }</i><j>{ $j }</j></eval>

</run>