SELFHTML/Navigationshilfen XML/DTDs Darstellung von XML-Daten |
XPath ist ebenso wie XML, XSL und XSLT ein Sprachprojekt des W3-Konsortiums. Für XPath gibt es eine eigene W3-Arbeitsgruppe, die an der Spezifikation der XPath-Sprache arbeitet. Im November 1999 ist dabei die Version 1.0 der Empfehlung (Recommendation) für XPath herausgekommen. Die jeweils aktuelle Spezifkation und die Fortentwicklung der XPath-Sprache können Sie über die W3-Einstiegsseite zu XPath mitverfolgen.
XPath ist jedoch lediglich eine Art Hilfssprache, die erforderlich ist, damit XSLT seine Aufgaben wahrnehmen kann. Xpath hat dabei drei wichtige Aufgaben:
Beim Übersetzen einer XML-Dokumentstruktur in eine andere XML-Dokumentstruktur, also etwa beim Übersetzen eines Dokuments mit eigener XML-DTD in ein HTML-Dokument, ist es wichtig, jeden Bestandteil der Datenstruktur genau ansprechen zu können. Wenn Sie im (XML)-Ausgangsbaum beispielsweise stehen haben: <augen farbe="graublau">
, und Sie möchten im (HTML)-Ergebnisbaum daraus erzeugen: <th>Augenfarbe</th><td>graublau</td>
, dann müssen Sie auf das Attribut farbe
des Elements augen
zugreifen. Angenommen weiter, das Element augen
ist sowohl ein Kindelement eines Elements namens person
, als auch ein Kindelement eines Elements namens phantombilddaten
in einem anderen Zweig des geichen XML-Dokuments. Daraus können Sie erahnen, dass für die eindeutige Adressierung von Dokumentbestandteilen eine brauchbare Adressierungs-Syntax benötigt wird. Typische Fälle, in denen die XPath-Adressierung zum Einsatz kommt, sind z.B. das select
-Attribut der xsl:value-of-Anweisung oder das match
-Attribut der xsl:template-Anweisung.
Das Adressieren von Daten mit XPath wird auf dieser Seite weiter unten beschrieben.
Damit sind logische Ausdrücke gemeint, die vom XSLT-Prozessor mit verarbeitet werden, und die zur Funktionalität bestimmter XSLT-Elemente wichtig sind. Logische Ausdrücke enthalten Operatoren und können damit z.B. zwei Werte vergleichen. Ähnlich wie die Adressierung von Daten kommt die Definition von Ausdrücken in bestimmten Wertzuweisungen an Attribute von XSLT-Elementen vor. Ein typisches Beispiel ist das test
-Attribut der xsl:if-Anweisung. Darin wird eine Bedingung formuliert, die wahr oder falsch sein kann. Nur wenn sie wahr ist, werden untergeordnete Anweisungen ausgeführt. Eine Bedingung wie test="alter >= 18"
(hat das Element alter
einen Wert größer gleich 18?) ist so ein typischer logischer Ausdruck. Die Syntax dabei basiert auf XPath.
Die Definition von logischen Ausdrücken mit XPath wird auf dieser Seite im Abschnitt XPath-Operatoren beschrieben.
Seinen großen Leistungsumfang erhält XSLT nicht zuletzt durch ein Arsenal an zusätzlichen Funktionen, die bestimmte Aufgaben wahrnehmen. So gibt es z.B. eine Funktion position()
, die beim Abarbeiten mehrerer Elemente in einer Reihe zurückliefert, das wie vielte Element gerade bearbeitet wird. Diese Information lässt sich beispielsweise dazu nutzen, um die Elemente im Ergebnisbaum zu nummerieren. Eine andere typische Funktion namens starts-with()
überprüft, ob eine Zeichenkette mit einer bestimmten Teilzeichenkette beginnt. Wenn diese Funktion etwa als Bedingung in einer xsl:if
-Anweisung notiert wird, lässt sich das Erzeugen des Ergebnisbaums von der Abfrage beeinflussen, ob der Wert eines Elements mit einem bestimmten Zeichen oder einer bestimmten Zeichenfolge beginnt. So könnte eine Bedingung wie test="starts-with(plz,'8')"
zum Beispiel abfragen, ob der Wert einer Postleitzahl mit 8
beginnt, und nur Elemente in den Ergebnisbaum übernehmen, bei denen dies der Fall ist.
Die zusätzlichen Funktionen werden auf der Seite XPath-Funktionen beschrieben.
XML-gerechte Dokumente sind wie die Verzeichnis- und Dateistruktur auf einem Datenträger aufgebaut. Dort gibt es ein Wurzelverzeichnis, das Verzeichnisse (Ordner) und Dateien enthalten kann. Jedes untergeordnete Verzeichnis kann wiederum andere Unterverzeichnisse und Dateien enthalten usw. Man spricht dabei auch von Baumstruktur. Auf der Seite Baumstruktur und Knoten einer XML-Datei wird dieses Modell einführend beschrieben.
Ebenso, wie man bei der Dateistruktur auf einem Datenträger von Verzeichnissen oder Ordnern, Dateien und Pfadangaben für Dateien spricht, braucht man für die Adressierung von Bestandteilen eines XML-Dokuments eine geeignete Terminologie. Zu diesem Zweck gibt es in XPath verschiedene Knotentypen, Achsen und Pfade. Die Begriffe, die dabei auftauchen, werden im folgenden vorgestellt. Die Begriffe muten zunächst etwas akademisch an, aber zum Verständnis von XPath sind sie wichtig. Entscheidend sind die englischen Originalbegriffe (kursiv geschrieben).
Jeder Bestandteil der Baumstruktur einer XML-Datei wird als Knoten bezeichnet. Da es in XML jedoch durchaus namhaft zu machende Bestandteile wie Elemente, Attribute usw. gibt, wird von entsprechenden Knotenypen gesprochen. Die Knotentypen sind nicht unmittelbar Bestandteil der Adressierungs-Syntax von XPath, doch es ist sinnvoll, die Begriffe zu kennen. XPath unterscheidet 7 Knotentypen:
|
Die Baumstruktur eines XML-Dokuments ergibt für die einzelnen Knoten, dass diese verschiedene Beziehungen untereinander haben. So gibt es Knoten, die von anderen Knoten abhängen, und solche, die auf einer gemeinsamen Ebene liegen. Dafür hält XPath verschiedene Begriffe bereit, die aus der Verwandtschaftsterminologie stammen und als Achsen (axes) bezeichnet werden. Die englischen Begriffe (in der folgenden Tabelle kursiv dargestellt) werden auch bei der ausführlichen Adressierung verwendet. XPath unterscheidet 13 Achsen:
|
Xpath stellt zwei syntaktische Mittel bereit, um den Pfad zu einem oder mehreren Knoten zu notieren:
|
Beim Adressieren von Knoten einer XML-Datenstruktur gibt es Ausdrücke wie /child::person/child::augen/attribute::farbe
. Solche Ausdrücke werden als ausführliche Notation bezeichnet, weil sie die vollen Achsenbezeichnungen enthalten. Der Ausdruck /child::person/child::augen/attribute::farbe
kann jedoch ebensogut in der Form /person/augen/@farbe
notiert werden. Dies ist die verkürzte Notation, die auf die Achsenbezeichnung child::
verzichtet und einige andere Einsparungen erlaubt. In den Beispielen weiter unten werden die beiden Notationsvarianten jeweils parallel gezeigt.
Jedes XML-Dokument hat eine Wurzel, die auch adressierbar ist.
<xsl:template match="/"> <html><head><title>Beispiel</title></head> <body> <xsl:apply-templates /> </body></html> </xsl:template> |
Der Wurzelknoten eines XML-Dokuments wird mit einem einzelnen Schrägstrich (/
) adressiert. Im Beispiel wird mit xsl:template ein Template für die XML-Dokumentwurzel definiert. Im match
-Attribut wird die Dokumentwurzel adressiert.
Knoten eines XML-Dokuments sind mit Hilfe einer absoluten Pfadangabe adressierbar.
<xsl:template match="/child::adresse/child::vorname"> <b><xsl:value-of select="/child::adresse/child::vorname"></b> </xsl:template> |
<xsl:template match="/adresse/vorname"> <b><xsl:value-of select="/adresse/vorname"></b> </xsl:template> |
Absolute Pfadangaben beginnen mit einem Schrägstrich (/
), der die Dokumentwurzel repräsentiert. Weitere Hierarchie-Ebenen werden durch weitere Schrägstriche markiert. Die Knoten, über die der Pfad läuft, werden wie in Beispiel 1 gezeigt durch ihre Achse und den gewünschten Knotennamen bezeichnet, getrennt durch doppelten Doppelpunkt (::
). Ebenfalls erlaubt und häufiger verwendet ist allerdings die in Beispiel 2 gezeigte verkürzte Notation ohne Achsenbezeichnungen. Im Beispiel wird mit der xsl:template
-Anweisung ein Template für ein Element namens vorname
definiert, das ein Kindelement des Elements adresse
ist, das wiederum ein Kindelement der Dokumentwurzel ist. Auch im select
-Attribut der xsl:value-of-Anweisung wird die Syntax verwendet.
Knoten eines XML-Dokuments sind mit Hilfe einer relativen Pfadangabe adressierbar.
<liga> <liga-eintrag> <spieler>...</spieler> <ergebnis> <punktzahl>...</punktzahl> </ergebnis> </liga-eintrag> </liga> |
<xsl:template match="./child::liga-eintrag/child::ergebnis"> <span class="normal"><xsl:value-of select="parent::spieler"></span> <span class="betont"><xsl:value-of select="./child::punktzahl"></span> </xsl:template> |
<xsl:template match="liga-eintrag/ergebnis"> <span class="normal"><xsl:value-of select="../spieler"></span> <span class="betont"><xsl:value-of select="punktzahl"></span> </xsl:template> |
Das Beispiel nimmt eine typische verschachtelte Elementstruktur an. Es nimmt an, dass es für das Element liga
eine Template-Definition gibt, in der mit der der xsl:apply-templates-Anweisung untergeordnete Templates aufgerufen werden. Weiterhin nimmt das Beispiel an, dass für das Element liga-eintrag
keine Template-Definition exisitert, erst wieder für dessen Kindelement ergebnis
. Um dieses Element aus Sicht des Großvaterelements liga
zu adressieren, ist eine relative Pfadangabe im match
-Attribut der xsl:template-Anweisung nötig. In der ausführlichen Notation lautet diese Pfadangabe ./child::liga-eintrag/child::ergebnis
, in der verkürzten, leichter lesbaren Notation liga-eintrag/ergebnis
. Die Zeichenfolge ./
(Punkt und Schrägstrich) steht für "aktueller Standpunkt". Diese Zeichenfolge kann auch weggelassen werden. Ansonsten besteht die relative Pfadangabe einfach aus der Folge der hierarchie-bestimmenden Knotennamen. Bei der ausführlichen Notation wird dabei stets noch die Achsenbezeichnung child::
benutzt, während bei der verkürzten Notation die bloßen Knotennamen (im Beispiel die Elementnamen liga-eintrag
und ergebnis
) genügen. Trennzeichen für Hierarchie-Ebenen ist einfache Schrägstrich (/
).
Innerhalb der Template-Definition für das Element ergebnis
wird unter anderem HTML-Code für ein anderes Element der Ausgangsdaten, nämlich für das Element spieler
notiert. Dieses Element liegt jedoch auf der gleichen Hierarchie-Ebene wie das aktuelle Element ergebnis
(Geschwisterknoten). Um es aus Sicht von ergebnis
anzusprechen, muss es über den Umweg des gemeinsamen Elternelements adressiert werden. In der ausführlichen Notation steht dafür die Achsenbezeichnung parent::
zur Verfügung, gefolgt vom Namen des anderen Kindknotens. In der verkürzten Notation genügt die Angabe von zwei Punkten, gefolgt von einem Schrägstrich (../
), um den Weg über das Elternelement zu beschreiben.
Für die HTML-Ausgabe des Elements punktzahl
wird ebenfalls eine relative Adressierung verwendet. Da das Element punktzahl
aus Sicht des aktuellen Elements ergebnis
einfach ein Kindelement ist, genügen die Angaben ./child::punktzahl
(ausführliche Notation) bzw. punktzahl
(verkürzte Notation) zur Adressierung.
Attribute von Elementen werden in XPath als Attributknoten behandelt und entsprechend adressiert.
<xsl:template match="./child::augen/attribute::farbe"> <tr><td><b><xsl:text>Augenfarbe:</xsl:text></b></td> <td><xsl:value-of select="." /></td></tr> </xsl:template> |
<xsl:template match="augen/@farbe"> <tr><td><b><xsl:text>Augenfarbe:</xsl:text></b></td> <td><xsl:value-of select="." /></td></tr> </xsl:template> |
Das Beispiel nimmt an, dass es eine XML-Notation <augen farbe="...">
gibt. Für das Attribut wird ein eigenes Template definiert. Dabei wird im HTML-Ergebnisbaum eine zweispaltige Tabellenzeile erzeugt, in der links das statische Wort Augenfarbe:
steht, während in der rechten Spalte der Wert des Attributs farbe=
ausgegeben wird. Das match
-Attribut der Template-Definition wird so adressiert, dass das Template von einem Elternelement von augen
aus - z.B. von person
- aufgerufen werden kann. Der Pfad lautet dann in der ausführlichen Notation ./child::augen/attribute::farbe
und in der verkürzten, gebräuchlicheren Notation augen/@farbe
. Bei der ausführlichen Notation kommen also die Achsenbezeichnungen child::
(für Kindelement child
aus Sicht von person
) und attribute::
für die Auswahl von dessen Attribut farbe
zum Einsatz. In der verkürzten Notation genügt die relative Angabe des Kindelements augen
und der Attributname, angeführt von einem Klammeraffen (@
).
Die Adressierung mit Wildcards erlaubt es, mehrere Knoten auf einmal auszuwählen.
<dateicode> <signature>474946383961</signature> <screen-descriptor>10000200B30000</screen-descriptor> <color-map>000000BF000000BF00BFBF00</color-map> <extension-block>21F90401000000</extension-block> <!-- usw. --> </dateicode> |
<xsl:template match="dateicode"> <xsl:value-of select="child::*" /> </xsl:template> |
<xsl:template match="dateicode"> <xsl:value-of select="*" /> </xsl:template> |
Das Beispiel nimmt an, dass mit Hilfe von XML-Elementen der Aufbau einer Binärdatei (im Beispiel: GIF-Format) beschrieben wird. In der Ausgabe sollen die Inhalte aller Kindelemente von dateicode
einfach in einem Rutsch geschrieben werden. In der Template-Definition zu dateicode
wird dies im select
-Attribut der xsl:value-of-Anweisung durch Angabe des Wildcard-Zeichens *
(Sternzeichen) erreicht. In der ausführlichen Notation ist die Achsenbezeichnung child::
angegeben, in der verkürzten Notation kann diese entfallen.
Das Wildcardzeichen *
(Sternzeichen) wählt nur auf der nächstuntere Hierarchie-Ebene aus. Eine verschärfte Form ist die Zeichenfolge //
(zwei Schrägstriche). Damit wird auf allen untergeordneten Hierarchie-Ebenen ausgewählt, egal, wie tief sich der Baum noch verzweigt.
Durch absolute und relative Adressierung ist noch nicht jedes beliebige Element ansprechbar. Angenommen, ein Element namens liste
hat 25 Kindelemente namens listeneintrag
, dann greift eine Adressierung wie liste/listeneintrag
nur auf das erste dieser Elemente zu. Solche Probleme lassen sich zwar auch durch xsl:for-each-Schleifen in den Griff bekommen, doch manchmal wird man auch nur ein bestimmtes der Kindelemente ansprechen wollen, und nicht alle der Reihe nach. Die folgenden Beispiele zeigen Adressierungen mit Positionsangaben und Bedingungen, um bestimmte einzelne Elemente zu adressieren. Dabei kommen zum Teil auch XPath-Funktionen zum Einsatz.
Syntax-Bestandteile in eckigen Klammern ([]
) gehören ebenfalls zum Inventar der Adressierung mit Positionsangaben und Bedingungen. Solche Bestandteile werden als Prädikate bezeichnet. Viele der folgenden Beispiele verwenden solche Prädikate.
|
XPath bietet eine Reihe von Operatoren an, die es erlauben, Werte zu vergleichen, Berechnungen durchzuführen, oder Ausdrücke zu bewerten. Solche Operatoren können in Attributen bestimmter XSLT-Elemente vorkommen. Dort helfen sie, Bedingungen zu formulieren, Elementpositionen zu berechnen und anderes mehr. XPath kennt folgende Operatoren:
|
XPath-Funktionen | |
XSLT-Elemente | |
SELFHTML/Navigationshilfen XML/DTDs Darstellung von XML-Daten |
© 2001 selfhtml@teamone.de