• Keine Ergebnisse gefunden

XPath S als Teilmenge von XPath

Im Dokument Serielle Transformationen von XML (Seite 80-83)

4   Die Transformationssprache XSLT   41

5.4 Pfadsprache STXPath

5.4.1 XPath S als Teilmenge von XPath

Entfernung aller Bezüge zu XML Schema

Wie in Kapitel 5.3.2 bereits diskutiert wurde, unterstützt STX keine Schema-Typen.

Damit sind alle Schema-Bezüge in XPath für STXPath gegenstandslos.

Aus der Grammatik für XPath 2.0 wurden aus diesem Grund die Produktionsregeln 7–9, 61–64, 66–73, 75, sowie 79–80 gestrichen. In den Produktionsregeln 24–27 wurde jeweils der optionale rechte Teil entfernt. Die Operatoren instance of, treat as, castable as und cast as werden damit durch STXPath nicht unterstützt. Schließlich wurden in der Produktionsregel 65 die Alternativen Document-Test, ElementTest und AttributeTest entfernt, da diese in XPath 2.0 aufgenommenen Knotentests in erster Linie für den Test auf einen bestimmten Schematyp gedacht sind.

Entfernung expliziter Achsen

Die in XPath vorhandenen Achsen (siehe auch Kapitel 4.3) dienen der Navigation im XML-Baum. In STX steht jedoch kein vollständiger Baum zur Verfügung, sondern nur die Knoten auf dem Vorfahren-Stack. Aus diesem Grund erscheinen zunächst allein solche Achsen sinnvoll, die auf den Kontextknoten, dessen Vorfahren und dessen Attribute zugreifen, speziell self, parent, ancestor, ancestor-or-self und attribute.

Allerdings ist für die Vorfahrenachsen ancestor bzw. ancestor-or-self keine abkürzende Schreibweise in XPath definiert. Die Einführung einer neuen STX-spezifischen Abkürzung kommt aufgrund der angestrebten XPath-Kompatibilität nicht in Betracht. Daher wurde zugunsten der Leserlichkeit und Kompaktheit von STXPath als Kompromiss auf die »entgegengesetzte« Achse descendant

zurück-Serielle Transformationen von XML. Probleme, Methoden, Lösungen.

68 5  Streaming Transformations for XML

gegriffen, für die als Abkürzung die Schreibweise //7 definiert ist. Somit können bei der Verwendung von descendant als Ersatz für ancestor alle Pfadausdrücke in STXPath allein mit der abgekürzten Syntax dargestellt werden. Explizite Achsen können also vollständig aus STXPath gestrichen werden. Die noch in XPath 1.0 vorhandene Achse namespace gibt es in XPath 2.0 nicht mehr.

In der Grammatik bedeutet dies, dass die beiden Produktionsregeln 52 und 53 komplett entfallen. Die Produktionsregeln 48 und 49 wurden auf die jeweils zweite Alternative verkürzt, d.h. auf AbbrevForwardStep bzw. AbbrevReverseStep.

Der Preis für diese kompakte Syntax ist die geänderte Semantik der Notationen //

und /. Es wird nur auf Knoten des Vorfahren-Stack zugegriffen, d.h. auf die aktuellen Vorfahren des Kontextknotens. Hierbei handelt es sich um eine Teilmenge der Knoten, die der gleiche Pfad in XPath in einem vollständigen Baum auswählen würde.

Beispiel Diese Änderung soll anhand des Beispiels in Abbildung 1 auf Seite 19 verdeutlicht

werden. Der Pfad /faq/antwort/absatz greift in XPath auf alle absatz -Ele-mente dieses Dokuments zu. In STX hingegen hängt das ausgewählte Element von dem aktuellen Kontextknoten ab. Handelt es sich beispielsweise um den Textknoten, der mit dem Wort »Middleware« beginnt, wählt der angegebene Pfad nur dessen absatz-Elternelement aus, nicht jedoch die anderen absatz-Elemente. Abbildung 4 veranschaulicht dieses Szenario. Sowohl der Kontextknoten als auch der zum ausge-wählten absatz-Elementknoten führende Pfad sind hier hervorgehoben.

Abbildung 4 Vorfahren-Stack und Pfade in STX

/

Middleware...

antwort

absatz absatz gruß name

... I hope ... Rick ...

<!-- Vorsicht, ...-->

quelle faq

I've come ...

frage

XML Middleware . What ...

begriff

Kontextknoten

...

Im Allgemeinen wählt ein solcher Pfad – anders als in XPath – damit maximal einen Knoten aus, und zwar denjenigen, der sich unter den Vorfahren des Kontextknotens befindet. Ein Pfad //absatz enthält nur dann mehrere absatz-Elemente, wenn diese sich zusammen auf der Vorfahrenachse befinden. Dies ist nur dann der Fall, wenn absatz-Elemente ineinander verschachtelt auftreten.

7Diese Darstellung ist so nicht ganz exakt. Genau genommen ist // die Abkürzung für /descendant-or-self::node()/. Allerdings verhält sich diese Abkürzung in den meisten Fällen so, als würde direkt descendant verwendet worden sein. Einzig bei der Nummerierung der ausgewählten Knoten (wichtig für positionale Prädikate) gibt es Unterschiede.

Dissertation, Oliver Becker, 1. Juli 2004

5.4  Pfadsprache STXPath 69

Entfernung erweiterter Pfade

In XPath 2.0 sind neben den bekannten Schritten entlang der vorhandenen Achsen auch weitere Ausdrücke in jedem Schritt möglich, beispielsweise Literale, Variablen-referenzen oder Funktionsaufrufe. Innerhalb von Klammern kann letztendlich jeglicher gültige XPath-Ausdruck stehen. Semantisch verbindet sich damit, dass der diesen Schritt repräsentierende Teilausdruck auf der bis dahin ausgewählten Knotenmenge berechnet wird. Liefert das Ergebnis wieder eine Knotenmenge, kann die Auswertung des Pfades wie bekannt fortgesetzt werden, ansonsten bricht die Berechnung mit einem Fehler ab. Bereits in XPath 1.0 konnten Pfade mit einer Variablenreferenz oder einem Funktionsaufruf beginnen, durften dann aber nur mit Schritten entlang der Achsen fortgesetzt werden.

In STX ist es nicht möglich, ausgehend von einem willkürlich gewählten Knoten zu anderen Knoten zu gelangen. Die vorhandenen (eingeschränkten) Achsen können ausschließlich auf die Liste der aktuellen Vorfahren zugreifen. Es ist nicht möglich, den Kontextknoten explizit für die Berechnung von Ausdrücken zu ändern.

Damit ist klar, dass Schritte, die beliebige Knoten berechnen, innerhalb eines Pfades in STX nicht realisierbar sind. Zwar können einzelne Knoten zum Beispiel als Werte von Variablen gespeichert werden, jedoch kann von diesen Knoten nicht mehr zu ihren Vorfahren navigiert werden.

Um die XPath-Grammatik entsprechend zu ändern, wird zunächst eine redundante Erweiterung vorgenommen. Offenbar lässt sich das Symbol ValueExpr unter Anwen-dung der (originalen) Produktionsregeln 35, 36, 37 und 38 in das Symbol FilterStep überführen. Die Erweiterung der Produktionsregel 35 um eine zusätzliche Alternative auf der rechten Seite, durch die eine direkte Ersetzung durch das Symbol FilterStep ermöglicht wird, ist damit redundant und ändert die definierte Sprache nicht.

Das anschließende Entfernen der Alternative FilterStep in der Produktionsregel 38 lässt nun die durch FilterStep definierten Ausdrücke nicht mehr als Pfadbestandteile zu. Sie sind jedoch durch die vorherige Erweiterung der Produktionsregel 35 weiterhin als allein stehende Ausdrücke möglich. Pfade in STXPath enthalten damit ausschließ-lich (abgekürzte) Schritte entlang der verfügbaren Achsen.

Einschränkung der Anzahl der Prädikate

Innerhalb von STXPath-Pfaden kann in jedem Schritt maximal ein Prädikat angegeben werden. In Kapitel 4.3 wurde bereits dargestellt, dass mehrfache Prädikate allein bei der Auswertung von Positionsinformationen von Bedeutung sind. In einem seriellen Transformationsprozess sind jedoch Informationen über bereits verarbeitete Knoten für einen Vergleich nicht mehr verfügbar. Demzufolge kann der STX-Prozessor im Nachhinein nicht mehr bestimmen, für wieviele Knoten der Eingabe ein konkretes Prädikat zutraf, um eine Positionsangabe bezüglich dieses Prädikates zu ermitteln.8 Positionen bezüglich des Elternknotens (für eine Abfrage innerhalb des ersten Prädi-kats) werden mittels einfacher Zähler für die jeweiligen Knotentests realisiert.

8Korrekterweise muss hier gesagt werden, dass es auch in einer seriellen Verarbeitung möglich ist, die sich aus mehrfachen Prädikaten ergebenden Positionsangaben zu bestimmen. Für jedes solche Prädikat muss ein Zähler verwaltet werden, der bei Erfüllung dieses Prädikats um eins erhöht wird und somit die Position für das folgende Prädikat enthält. Dies hätte jedoch einen nicht unerheblichen Performanceverlust zur Folge, weil für jeden Knoten der Eingabe im gesamten Transformations-Sheet alle Pfade mit mehrfachen Prädikaten ausgewertet werden müssen, unabhängig davon, welches konkrete Template jeweils benutzt wird.

Serielle Transformationen von XML. Probleme, Methoden, Lösungen.

70 5  Streaming Transformations for XML

Aus diesem Grund wird die Regel 44 so abgewandelt, dass sie maximal ein Prädikat erzeugt.

Prädikate sind jedoch nicht auf Schritte in einem Pfad beschränkt, sondern können ebenso auf Sequenzen angewendet werden. Hier sind mehrere Prädikate jedoch un-kritisch, da alle Werte der Sequenz für eine Auswertung zur Verfügung stehen. In der Grammatik ist das Symbol PrimaryExpr das Startsymbol für alle in STXPath möglichen Ausdrücke, die primär keine Pfade sind und somit eine beliebige Sequenz liefern. In der Regel 40 wird daher auf der rechten Seite dem Symbol Predicate der Wiederholungsoperator nachgestellt, sodass auf diese Weise der vorherige Zustand wieder hergestellt wird.

Entfernung spezieller Operationen auf Knoten

Einige Operationen in XPath 2.0 operieren auf Knotenmengen. In STX werden aber maximal die aktuellen Vorfahrenknoten in einem Schritt ausgewählt. Operationen, die Knotenmengen vereinigen oder den Durchschnitt bzw. die Differenz bilden, sind für die eingeschränkten STX-Knotenmengen nur von geringem praktischen Wert.

Sie werden deshalb in STXPath nicht unterstützt. Das gleiche gilt für die Knotenope-rationen, die zwei Knoten auf Identität prüfen oder für zwei Knoten ihre relative Ordnung im Dokument bestimmen.

In der Grammatik entfallen damit die mehrfach optionalen Bestandteile (*-Operator) der Produktionsregeln 33 und 34 (union, intersect und except). Darüber hinaus werden die Produktionsregeln 46 und 47 vollständig gestrichen und die Pro-duktionsregel 28 entsprechend modifiziert.

Im Dokument Serielle Transformationen von XML (Seite 80-83)