390 likes | 509 Views
Vortrag zum Seminar XML und Datenbanken. XML Path Language 1.0 - XPath. Matthias Brosemann Friedrich-Schiller-Universität Jena. Inhalt. Einleitung Datenmodell XPath-Ausdrücke - Datentypen - Kontextbezogene Auswertung - Lokalisierungspfade - Ausdrücke Grundfunktionsbibliothek
E N D
Vortrag zum Seminar XML und Datenbanken XML Path Language 1.0 - XPath Matthias Brosemann Friedrich-Schiller-Universität Jena
Inhalt • Einleitung • Datenmodell • XPath-Ausdrücke • - Datentypen • - Kontextbezogene Auswertung • - Lokalisierungspfade • - Ausdrücke • Grundfunktionsbibliothek • Zusammenfassung & Ausblick
Einleitung Ziel: mit XML arbeiten, d. h. zunächst XML-Daten aus einem Dokument adressieren 1. Möglichkeit: navigierende/prozedurale Ansätze wie DOM oder SAX 2. Möglichkeit: deskriptive Anfragesprachen dazu ein Auszug der Kriterien für Anfragesprachen aus der DBS1-Vorlesung: Mengenorientiertheit Deskriptivität Abgeschlossenheit Adäquatheit Eingeschränktheit Sicherheit jede Operation arbeitet auf Mengen von Daten Benutzter formuliert „WAS“ er haben will und nicht das „WIE“ Anfrageergebnisse können als neue Eingabe verwendet werden alle Konstrukte des Datenmodells werden unterstützt Anfragesprache darf keine komplette Programmiersprache sein keine syntaktisch korrekte Anfrage erzeugt Endlosschleife oder unendliches Ergebnis
Einleitung Ziel: mit XML arbeiten, d. h. zunächst XML-Daten aus einem Dokument adressieren 1. Möglichkeit: navigierende/prozedurale Ansätze wie DOM oder SAX 2. Möglichkeit: deskriptive Anfragesprachen dazu ein Auszug der Kriterien für Anfragesprachen aus der DBS1-Vorlesung: Mengenorientiertheit Deskriptivität Abgeschlossenheit Adäquatheit Eingeschränktheit Sicherheit DOM: nein (Operationen nur auf einem Knoten) nein (prozeduraler/navigierender Ansatz) ja (Ergebnisse können als Parameter verwendet werden) ja (verschiedene Knotentypen für verschiedene Konstrukte) nein (sind in komplette Programmiersprachen eingebettet) nein (Programme können Endlosschleifen enthalten)
Einleitung „Die primäre Aufgabe von XPath besteht in der Adressierung von Teilen eines XML-Dokuments.“ „XPath benutzt eine kompakte Nicht-XML-Syntax, um die Verwendung von XPath-Ausdrücken innerhalb von URIs und XML-Attributen zu erleichtern.“ Mengenorientiertheit Deskriptivität Abgeschlossenheit Adäquatheit Eingeschränktheit Sicherheit XPath: primäres Ziel ? ? ? „sekundäres“ Ziel ?
Einleitung XPath ist das Ergebnis der Zusammenarbeit der XPointer- und XSL-Arbeitsgruppen. XPointer: Adressierung von Teilen eines XML-Dokumentes in einer URI, z. B.: http://www.example.com/rezepte.xml/rezepte[zutat[@id = "Mehl"]] XSLT: XPath-Ausdrücke werden z. B. zum Matching benutzt Eine weitere Anwendung findet XPath in den XML Schemas, um dort die identity constraints definieren zu können.
/ Wurzelknoten Elementknoten rezept xml xml-stylesheet Namensraumknoten Processing-Instruction-Knoten zutat weitere Zutaten anleitung xml xml Kommentarknoten id Attributknoten Zuerst nehmen... zutat und mischen es... 200g Mehl xml Textknoten xlink xlink:href Mehl xlink:type Datenmodell <?xml version="1.0"?> <!DOCTYPE rezept SYSTEM "rezept.dtd"> <?xml-stylesheet href="style.xsl" type="text/xml"?> <rezept> <zutat id="mehl">200g Mehl</zutat> <!-- weitere Zutaten --> <anleitung> Zuerst nehmen Sie das <zutat xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="mehl">Mehl</zutat> und mischen es mit ... </anleitung> </rezept>
Datenmodell XPath operiert auf der logischen Darstellung des XML-Dokumentes, dem Baum. Dieser besitzt Knoten verschiedener Typen: Wurzelknoten repräsentiert das Dokument; ist einzigartig und Wurzel des Baumes Elementknoten repäsentiert ein Element; ist Kindknoten eines Elementknotens oder des Wurzelknotens; hat diesen als Elternknoten Attributknoten repräsentiert ein Attribut; ist kein Kindknoten, hat aber den zuge-hörigen Elementknoten als Elternknoten; Attribute mit xmlns als Präfix sind keine Attributknoten Namensraumknoten repräsentiert eine Namensraumdefinition für ein Element (auch vom Elternknoten vererbte); ist kein Kindknoten, hat aber den zugehörigen Elementknoten als Elternknoten Kommentarknoten repräsentiert ein Kommentar, der nicht innerhalb der DTD steht PI-Knoten repäsentiert eine PI, die nicht innerhalb der DTD steht Textknoten repräsentiert einen Textabschnitt ; ist Kindknoten eines Element-knotens und hat diesen als Elternknoten; er Textabschnitt ist so groß wie möglich, es gibt als keine zwei benachbarten Textknoten; ein Textknoten enthält min. ein Zeichen; Textknoten, die nur als Leer-raumzeichen bestehen, können weggelassen werden
Datenmodell Die Dokumentordnung ist eine Ordnung der Knoten des Baumes bezüglich ihres Auftretens im XML-Dokument. Besonderheiten: - Der Wurzelknoten ist der erste Knoten in der Dokumentordnung. - Die Kinder eines Knotens sind wie folgt sortiert: Namensraumknoten, Attributknoten, restliche Knoten. - Die relative Ordnung der Namensraum- und Attributknoten ist implementationsabhängig. Die Dokumentordnung kann undefiniert sein. So können z. B. mit XSLT die Bäume zweier XML-Dokumente vereinigt werden. Die oben genannte Definition lässt sich dann nicht auf den resultierenden Baum anwenden.
XPath-Ausdrücke - Datentypen XPath definiert vier Datentypen: - boolean true oder false - number Gleitkommazahl, z. B. –5 oder 4.39883 - string Zeichenkette aus UCS-Zeichen*, z. B. “Ich bin Text.“ - node-set ungeordnete Menge von Knoten (also keine Duplikate) Der Rückgabewert eines XPath-Ausdrucks ergibt ein Objekt, das zu einem dieser vier Typen gehört. Auf XPath aufbauende Sprachen können weitere Datentypen definieren. So führt XSLT beispielsweise den Teilbaum als neuen Datentyp ein. *UCS = Universal Multiple-Octet Coded Character Set
XPath-Ausdrücke – Kontextbezogene Auswertung Die Auswertung eines XPath-Ausdruckes erfolgt immer bezüglich eines Kontextes(K, (KP, KG), v, f, n) mit: K - ein Knoten, der Kontextknoten KP - eine natürliche Zahl, die Kontextposition KG - eine natürliche Zahl, die Kontextgröße v - eine Abbildung von Variablennamen auf Variablenwerte, die Variablenbelegungen f - eine Abbildung von Funktionsnamen auf Funktionen, die Funktionsbibliothek n - eine Abbildung von Namensraumpräfixen auf Namensraum-URIs, die Menge der gültigen Namensräume (Namensraumdeklarationen) Es gilt stets: 0 KP KG
XPath-Ausdrücke – Kontextbezogene Auswertung Der Variablenwert ist ein Objekt von einem für Ausdrücke möglichen Typen. Variablen werden mit $Variablenname angesprochen. XPath selbst besitzt keine Konstrukte zum Definieren von Variablen. Dazu ist eine Sprachenerweiterung wie XSLT oder XQuery nötig. Jede Funktion besitzt null oder mehr Argumente und liefert einen einzelnen Wert. XPath definiert eine Bibliothek von Grundfunktionen, die von allen Implementationen unterstützt werden muss. Bei einer Grundfunktion gehören die Argumente und das Ergebnis einem der vier Grundtypen an. Die Variablenbelegungen, die Funktionsbibliothek und die Namensraum-deklarationen, die benutzt werden, um einen Teilausdruck zu berechnen, sind immer dieselben, die auch für den umgebenden Ausdruck benutzt werden.
XPath-Ausdrücke – Lokalisierungspfade Lokalisierungspfade adressieren Teile eines XML-Dokumentes. Es gibt relative und absolute Lokalisierungspfade. Ein relativer Lokalisierungspfad setzt sich aus einem oder mehreren Lokalisierungs-schritten zusammen, die mit einem Schrägstrich (/) voneinander getrennt werden. Ein Lokalisierungsschritt wählt eine Menge von Knoten bzgl. des Kontextes aus. Die Eingabe eines Lokalisierungsschrittes ist die aus dem vorhergehenden Schritt resultierende Knotenmenge. Alle Knoten dieser Menge werden nacheinander als Kontextknoten betrachtet und die resultierenden Knotenmengen werden vereinigt. Ein absoluter Lokalisierungspfad besteht aus einem führenden Schrägstrich, gefolgt von einem optionalem relativen Lokalisierungspfad. Die Eingabe des ersten Schrittes dieses relativen Pfades ist die Menge, die nur den Wurzelknoten enthält. Beispiel: /child::*/child::* (wählt alle Enkelknoten des Wurzelknotens aus)
XPath-Ausdrücke – Lokalisierungspfade Ein Lokalisierungsschritt besteht aus der Achse, dem Knotentest und beliebig vielen Prädikaten: axis::node_test[predicate_1][predicate_2]...[predicate_n] Die Achse ist eine der 13 vordefinierten Achsen und wählt eine Knotenmenge aus. Der Knotentest kann diese Menge anhand der Knotentypen oder der Namen der Knoten einschränken. Prädikate sind XPath-Ausdrücke, die für jeden verbleibenden Knoten ausgewertet werden. Ist das Ergebnis eine Zahl, so wird diese mit der Kontextposition des Knotens verglichen. Ansonsten wird das Ergebnis direkt in einen booleschen Wert konvertiert. Alle Knoten, für die die Auswertung eines Prädikats „falsch“ ergibt, werden aus der Menge herausgefiltert, bevor das nächste Prädikat ausgewertet wird.
self ancestor ancestor descendent preceding preceding following self following descendent XPath-Ausdrücke – Lokalisierungspfade Achsen: child parent following-sibling preceding-sibling descendent-or-self ancestor-or-self attribute namespace
Knotentests (auf Knotenname): - (qualifizierter) Name: Der erweiterte (Präfix wird expandiert) Name des Knotens muss gleich dem angegebenen Namen sein und der Typ des Knotens muss der Hauptknotentyp sein. z. B.: child::title XPath-Ausdrücke – Lokalisierungspfade Achsen besitzen sogenannte Hauptknotentypen. Der Hauptknotentyp der Attribut-Achse ist der Attributtyp, der der Namensraumachse der Namensraumtyp. Alle anderen Achsen besitzt den Elementtyp als Hauptknotentyp. - Namensraum-Präfix: Die expandierten Präfixe müssen übereinstimmen und der Typ des Knotens muss der Hauptknotentyp sein. z. B.: child::xhtml:* - beliebiger Name: Der Typ des Knotens muss der Hauptknotentyp sein. z. B.: child::*
XPath-Ausdrücke – Lokalisierungspfade Knotentests (auf Knotentyp): - beliebiger Knotentyp: Der Test ist für jeden Knoten erfüllt. z. B.: child::node() - Textknoten: Der Knoten muss vom Typ Text sein. z. B.: child::text() - Kommentarknoten: Der Knoten muss vom Typ Kommentar sein. z. B.: child::comment() - PI-Knoten: Der Knoten muss vom Typ Processing-Instruction sein. Wurde ein Literal angegeben, so muss das Ziel der PI gleich dem Literal sein. z. B.: child::processing-instruction() oder child::processing-instruction('xml-stylesheet')
XPath-Ausdrücke – Lokalisierungspfade Beispiele: /descendant::answer[position()=42] wählt das 42. answer-Element im Dokument aus. /child::doc/child::chapter[position()=5]/child::section[position()=last()] wählt das letzte section-Element des fünften chapter-Elements des doc-Dokumentelements aus. child::*[self::chapter or self::appendix] wählt die chapter- und appendix- Kindelemente des Kontextknotens aus. child::para[attribute::type='warning'][position()=5] wählt das fünfte para-Kindelement des Kontextknotens aus, das ein Attribut type mit dem Wert warning besitzt. child::para[position()=5][attribute::type="warning"] wählt das fünfte para-Kindelement des Kontextknotens aus, wenn dieses Kind ein type-Attribut mit dem Wert warning besitzt.
XPath-Ausdrücke – Lokalisierungspfade Abkürzungen: - child:: kann weggelassen werden. Damit ist die Standardachse die Kindachse. z. B.: /doc/chapter[5]/section[last()] - @ ist die Abkürzung für attribute:: z. B.: para[@type='warning'][5] - // ist die Abkürzung für /descendant-or-self::node()/ z. B.: /descendant::answer[position()=42]//question - . ist die Abkürzung für self::node() (vollständiger Lokalisierungsschritt) - .. ist die Abkürzung für parent::node() (vollständiger Lokalisierungsschritt) z. B.: ../title
XPath-Ausdrücke XPath-Ausdrücke können aus booleschen Operationen, Vergleichen, arithmetischen Operationen und einen Mengenoperator, sowie Lokalisierungspfaden bestehen. Beispiel: preceding::node() | self::node() Statt eines Lokalisierungspfades oder als Eingabe für einen Lokalisierungspfad kann ein Filter-Ausdruck verwendet werden. Dieser filtert das Ergebnis eines XPath-Ausdrucks, eines Funktionsaufrufes, einer Variablenreferenz oder einen konstanten Ausdruck mit Prädikaten. Beispiele: (preceding-sibling::* | following-sibling::*)[1] $divs[1]/following-sibling::* count(child::*[self::chapter or self::appendix])
Grundfunktionsbibliothek Funktionen für Knotenmengen: - last(), position() - count(node-set) Beispiele: $a[count(.|$b) = count($b)] (Durchschnitt von $a und $b) $a[count(.|$b) != count($b)] (Differenz von $a und $b) count(.|../@*) = count(../@*) (ist Kontextknoten ein Attributknoten?) - local-name(node-set), namespace-uri(node-set), name(node-set) geben lokalen Namen bzw. Namensraum-URI bzw. qualifizierten Namen des ersten Knotens aus der Knotenmenge aus. - id(object) Ist die Eingabe eine Liste von ID-Werten, so werden alle Elemente mit einem ID-Wert aus dieser Liste zurückgegeben. Ist die Eingabe eine Knotenmenge, so wird zu jedem Knoten aus der Menge der Zeichenkettenwert berechnet, id() mit diesem Wert aufgerufen und die Ergebnisse vereinigt.
Grundfunktionsbibliothek Funktionen für Zeichenketten: - string(object) Ist die Eingabe eine Knotenmenge, so werden die Zeichenkettenwerte (ZKW) aller Knoten aus dieser Menge miteinander verkettet zurückgegeben. Für den Wurzelknoten und die Elementknoten ist der ZKW die Verkettung der ZKW aller Textknoten-Nachkommen in Dokumentordnung. Der ZKW eines Textknotens ist der mit ihm assoziierte Text. Der ZKW eines Attributknotens ist der (normalisierte) Wert des Attributes, der des Namensraumknotens der Namensraum-URI. Für den PI-Knoten ist der ZKW die Anweisung ohne das Ziel, für den Kommentarknoten der gesamte Kommentartext. - concat(...), substring-before(...), substring-after(...), substring(...), string-length(...), normalize-space(...), translate(...) - starts-with(...), contains(...)
Grundfunktionsbibliothek Boolesche Funktionen: - boolean(object) Ist die Eingabe eine Knotenmenge, so ist das Ergebnis „wahr“, wenn die Menge nicht leer ist. Ist die Eingabe ein String, so ist das Ergebnis „wahr“, wenn der String min. ein Zeichen enthält. Beispiele: <img alt="" /> (XML-Dokument) /img[@alt] ergibt „wahr“ /img[string(@alt)] ergibt „falsch“ - not(boolean), true(), false() - lang(string) ergibt „wahr“, wenn mittels xml:lang im Kontextknoten oder im nächsten Vorfahr, der dieses Attribut spezifiziert, die angegebene Sprache oder eine Untersprache davon gesetzt wurde. Die Beispiele ergeben für den Test boolean(//para[lang('en')]) „wahr“: <div xml:lang="en"><para/></div> <para xml:lang="en-us"/>
Grundfunktionsbibliothek Zahlenfunktionen: - number(object) Konvertierung in eine Gleitkommazahl. Knotenmengen werden zunächst in einen String konvertiert, der anschließend geparst wird. - floor(number), ceiling(number), round(number) - sum(node-set) wendet auf jeden Knoten der Menge die Funktion number() an und addiert die Ergebnisse.
Zusammenfassung & Ausblick XPath erfüllt im Prinzip die genannten Kriterien für eine Anfragesprache. Die Abgeschlossenheit gilt insofern, dass weiter abfragbare Resultate auch als Eingabe für einen neuen XPath-Ausdruck gültig sind (Lokalisierungsschritte). Auch die Adäquatheit kann für gültig erklärt werden, da die Versionsinformation nichts mit den abstrakten Daten in einem XML-Dokument zu tun hat, genauso wenig wie die DTD, die lediglich als DDL dient. Mengenorientiertheit Deskriptivität Abgeschlossenheit Adäquatheit Eingeschränktheit Sicherheit XPath: ja (primäres Ziel) ja (rel. Lok.-pfade schaffen Unabhängigkeit von Hierarchietiefe) jein (nur Knotenmengen können als neue Eingabe verwendet werden) jein (DTD und Versionsinformation wird weggelassen) ja ja (Knotenmengen werden sukzessiv eingeschränkt)
Zusammenfassung & Ausblick Probleme mit XPath 1.0 / Neuerungen in XPath 2.0: - umständliche Mengenoperationen (ausgenommen Vereinigung) neue Mengenoperatoren für Durchschnitt und Differenz - Joins wenn überhaupt nur schwer möglich einfacher for-Ausdruck, Für-alle- und Existenzoperatoren, if-Ausdruck - wenig differenziertes Typsystem, Datentyptests nicht möglich Unterstützung des XML Schema Typensystems - wenig Knotentypentests möglich Erweiterung um Tests auf Elementknotentyp, Attributknotentyp, Namensraumtyp und Dokumentelementtyp weitere Neuerungen und Änderungen in XPath 2.0: - weitere Vergleichsmöglichkeiten - Anpassung des Datenmodells an das von XQuery und XSLT
Vortrag zum Seminar XML und Datenbanken XML Path Language 2.0 – XPath XQuery: An XML Query Language Matthias Brosemann Friedrich-Schiller-Universität Jena
Inhalt • Erweiterungen in XPath 2.0 • - Mengenoperatoren • - Vergleiche • - Typensystem • - Quantifizierung und Konditionierung • - Knotentests • Der FLWOR-Ausdruck • Konstruktoren
Erweiterungen in XPath 2.0 - Mengenoperatoren In XPath 2.0 ersetzt die Sequenz die Knotenmenge. Eine Sequenz ist eine (geordnete) Folge von Knoten oder Werten anderer Datentypen. Die Vereinigung operiert nun auf Sequenzen und eliminiert dabei Duplikate. Zusätzlich zum Vereinigungsoperator wird es in XPath 2.0 den Durchschnitts- und den Differenzoperator geben. Bei allen Mengenoperatoren muss die Sequenz nur Knoten besitzen. Das Ergebnis wird in Dokumentordnung sortiert. Beispiele: (A, B) union (B, C) ergibt (A, B, C) (A, B) intersect (B, C) ergibt (B) (A, B) except (B, C) ergibt (A) (wobei A, B und C Knoten sind)
Erweiterungen in XPath 2.0 - Vergleiche Die generelle Vergleichsoperatoren =, !=, <, <=, >, >= bleiben Existenz-qualifiziert. Beispiele: (A, B) = (B, C) ergibt true (A, B) != (B, C) ergibt true (wobei A, B und C Knoten sind) Zusätzlich werden eq, ne, lt, le, gt, ge eingeführt, die atomare Werte vergleichen. Beispiel: $book//author eq "Abiteboul" ergibt true genau dann, wenn $book genau einen Knoten enhält und dieser ein Nachkommen namens author besitzt, dass den Zeichenkettenwert Abiteboul enthält. Weiterhin sollen is, <<, >> benutzt werden, um Knoten zu vergleichen. Beispiele (wobei A und B Knoten sind): A is A ergibt true A << B ergibt true, wenn A in Dokumentordnung vor B steht
Erweiterungen in XPath 2.0 - Typensystem XPath 2.0 unterstützt das volle Typensystem der XML-Schemata. Beispiele: 5 instance of xs:integer ergibt true . instance of xs:string ergibt true, wenn der Kontextknoten ein String ist. . cast as example:datum konvertiert den Wert des Kontextknoten in den (eigenen) Datentyp example:datum . castable as xs:date ergibt true, wenn sich der Kontextknoten in den Typ date konvertieren lässt Die linke Seite dieser Operanden muss einen einzelnen Wert oder eine Sequenz mit höchstens einem Wert ergeben. instance of überprüft den Datentyp des Ausdrucks auf der linken Seite. cast as konvertiert den linken Ausdruck in den angegebenen Datentyp. castable as überprüft, ob sich der Ausdruck auf der linken Seite in den angegebenen Datentyp konvertieren lässt.
Erweiterungen in XPath 2.0 – Quantifizierung In XPath 2.0 kann die Quantifizierung explizit angegeben werden. Beispiele: some $x in (1, 2, 3), $y in (2, 3, 4) satisfies $x + $y = 4 ergibttrue, da z. B.1+3=4ist. every $x in (1, 2, 3), $y in (2, 3, 4) satisfies $x + $y = 4 ergibtfalse, da z. B.1+2=3ist. every $employee in //angestellter satisfies $employee/@entlassen ergibttrue, wenn das Dokument ein Element namens angestellter besitzt, dass ein entlassen-Attribut besitzt (egal welcher Inhalt). Desweiteren gibt es das if-Konstrukt. Beispiel: if ($employee/@entlassen) then $employee/name else "keiner entlassen"
Erweiterungen in XPath 2.0 – Knotentests Mit XPath 2.0 werden weitere Knotentests eingeführt. Beispiele: /descendent::*:angestellter gibt alle Elementknoten, die den (lokalen) Namenangestellter besitzen zurück. element(angestellter) element(angestellter,*) Beide Tests bestehen nur angestellter-Elemente. Um den ersten zu erfüllen, muss der Typ des Elements der entsprechenden Typdefinition aus dem XML-Schema passen. element(firma/abteilung/angestellter) passt zu allen Elementen, deren Typ und Name der Typdefinition im XML-Schema von angestellter innerhalb von abteilung innerhalb von firma entsprechen attribute(...) XQuery definiert ein switch-Konstrukt, dass Knotentypenbasiert entscheidet, z. B.: typeswitch($customer/billing-address) case $a as element(*, USAddress) return $a/state case $a as element(*, CanadaAddress) return $a/province
Der FLWOR-Ausdruck – for, let, where, order by, return for-Klauseln binden je eine oder mehr Variablen an eine Sequenz, z. B.: for $i in (1, 2, 3), $j in (6, 7) for $k in (9, 8) Die Ausführung der for-Klauseln erzeugt einen Tupelstrom (kartesisches Produkt), z. B.: (1, 6, 9), (1, 6, 8), (1, 7, 9), (1, 7, 8), (2, 6, 9), (2, 6, 8), (2, 7, 9), (2, 7, 8), (3, 6, 9), (3, 6, 8), (3, 7, 9), (3, 7, 8) let bindet zusätzliche Variablen an den Tupelstrom (ohne Produktbildung), z. B.: for $i in (1, 2, 3), $j in (6, 7) let $m := $i+$j for $k in (9, 8) (1, 6, 7, 9), (1, 6, 7, 8), (1, 7, 8, 9), (1, 7, 8, 8), (2, 6, 8, 9), (2, 6, 8, 8), (2, 7, 9, 9), (2, 7, 9, 8), (3, 6, 9, 9), (3, 6, 9, 8), (3, 7, 10, 9), (3, 7, 10, 8)
Der FLWOR-Ausdruck – for, let, where, order by, return Die where-Klausel filtert den Tupelstrom, z. B.: for $i in (1, 2, 3), $j in (6, 7) let $m := 78 for $k in (9, 8) where $m > $k (2, 7, 9, 8), (3, 6, 9, 8), (3, 7, 10, 9), (3, 7, 10, 8) order by sortiert den Tupelstrom und return gibt das Ergebnis eines Ausdruckes aus, z. B.: for $i in (1, 2, 3), $j in (6, 7) let $m := 78 for $k in (9, 8) where $m > $k stable order by $k return <out>{$j}</out> (2, 7, 9, 8), (3, 6, 9, 8), (3, 7, 10, 8), (3, 7, 10, 9) Ausgabe: <out>7</out><out>6</out><out>7</out><out>7</out>
Der FLWOR-Ausdruck – for, let, where, order by, return Beispiel: for $s in (<one/>, <two/>, <three/>) return <out>{$s}</out> Ausgabe: <out><one/><out> <out><two/><out> <out><three/><out> Beispiel: let $s := (<one/>, <two/>, <three/>) return <out>{$s}</out> Ausgabe: <out><one/><two/><three/><out>
Der FLWOR-Ausdruck – for, let, where, order by, return <bib> <book> <title>TCP/IP Illustrated</title> <author>Stevens</author> <publisher>Addison-Wesley</publisher> </book> <book> <title>Advanced Unix Programming</title> <author>Stevens</author> <publisher>Addison-Wesley</publisher> </book> <book> <title>Data on the Web</title> <author>Abiteboul</author> <author>Buneman</author> <author>Suciu</author> </book> </bib> for $a in fn:distinct-values(//author) return ($a, for $b in //book[author = $a] return $b/title) <author>Stevens</author> <title>TCP/IP Illustrated</title> <title>Advanced Unix Programming</title> <author>Abiteboul</author> <title>Data on the Web</title> <author>Buneman</author> <title>Data on the Web</title> <author>Suciu</author> <title>Data on the Web</title>
Konstruktoren Beispiel: for $s in (<one/>, <two/>, <three/>) return <out myattr="nix">{$s}</out> Beispiel: for $s in (element one {}, element two {}, element three {}) return element out { attribute myattr {"nix"}, $s } Beispiel: element book { attribute isbn {"isbn-0060229357" }, element title { "Harold and the Purple Crayon"}, element author { element first { "Crockett" }, element last {"Johnson" } } }
Komplexbeispiel <bib> <book> <title>TCP/IP Illustrated</title> <author>Stevens</author> <publisher>Addison-Wesley</publisher> </book> <book> <title>Advanced Unix Programming</title> <author>Stevens</author> <publisher>Addison-Wesley</publisher> </book> <book> <title>Data on the Web</title> <author>Abiteboul</author> <author>Buneman</author> <author>Suciu</author> </book> </bib> <authlist> <author> <name>Abiteboul</name> <books> <title>Data on the Web</title> </books> </author> <author> <name>Buneman</name> <books> <title>Data on the Web</title> </books> </author> <author> <name>Stevens</name> <books> <title>TCP/IP Illustrated</title> <title>Advanced Unix ...</title> </books> </author> <author> <name>Suciu</name> <books> <title>Data on the Web</title> </books> </author> </authlist> <authlist> { for $a in fn:distinct-values(//author) order by $a return <author> <name> { $a/text() } </name> <books> { for $b in //book[author = $a] order by $b/title return $b/title } </books> </author> } </authlist>