Einführung in XSLT in Beispielen
Autor: Udo.Altmann@informatik.med.uni-giessen.de
(Udo Altmann)
Zweck
Überführung eines XML-Dokuments in ein anderes (XML, aber auch
HTML oder Text) Dokument.
Grundlagen
Standarddokumente:
http://www.w3.org/TR/xslt XSL Transformations
(XSLT) Version 1.0 (W3C Recommendation)
http://www.w3.org/TR/xpath
XML Path Language. W3C Recommendation
http://www.w3.org/TR/REC-xml
Extensible Markup Language (XML) 1.0. (W3C Recommendation)
Werkzeug
http://www.jclark.com/xml/xt.html
XT von James Clark (Download: ftp://ftp.jclark.com/pub/xml/xt-win32.zip
) für Windows32 in Zusammenarbeit mit Microsoft Internet Explorer
5 (für die Microsoft Java VM und die Anzeige von XML/XSL-Dokumenten).
Auspacken und aufrufen mit
xt <quelle> <stylesheet> <ergebnisdatei>
Beispiel
Quelldokument: Basisdokumention für Tumorkranke bd5.xml
1. Einfache Ausgaben
Das einfachste Stylesheet
b1.xsl e1.txt
Merke:
-
XSLT Stylesheets werden in XML definiert. Die Tags gehören zum Namespace
XSL
-
Es gibt eine vorgegebene Verarbeitung, die alle Text- und Attributknoten
ausgibt, in diesem Fall in UTF-8-Encodierung
-
Es wird aber nicht automatisch ein gültiges XML-Dokument erzeugt.
Ausgabemethoden
b1a.xsl, b1b.xsl, b1c.xsl,
e1a.txt, e1b.txt, e1c.txt,
Merke:
-
Es gibt neben XML weitere OUTPUT-Methoden, wie z.B. Text oder HTML
2. Erste Templates
Wie erzeuge ich nun ein gültiges XML-Dokument?
b2.xsl e2.xml
Merke:
XSLT Stylesheets bestehen grundsätzlich aus einer Menge von sogenannten
Template-Rules, die aus Suchmustern (xsl:template match='/') und Anweisungen,
was mit Knoten passieren soll, auf die diese Suchmuster zutreffen, bestehen.
In diesem Fall wird für das Wurzelelement '/' im Ausgabe-Baum ein
Element root_element erzeugt, innerhalb dessen dann mit xsl:apply-templates
die vorgegebene Verarbeitung gestartet wird.
Die Match Anweisung und auch weitere, später eingeführte Anweisungen,
arbeiten mit der XPath-Syntax, um auf Knoten des Quell-Baumes zuzugreifen.
Die XPath-Syntax arbeitet ähnlich den Sprachelementen (".", "..",
"/"), die von Dateisystemen bekannt sind. Ein "//" findet dabei Elemente
in beliebiger relativer oder absoluter Tiefe im Quell-Baum sitzen.
Die Sprachelemente ".", ".." und "//" sind dabei nur Abkürzungen für
"self::node()", "parent::node()" und "/descendant-or-self::node()/".
"self::", "parent::" etc. (und noch weitere) sind dabei sogenannte Achsen,
entlang derer die Navigation im Quelldokument erfolgt. "node()" ist eine
Form des Testes auf einen Knotentyp (Name des Knotens oder Typ des Knotens).
So ist auch "abschnitt" nur eine Abkürzung für "child::abschnitt"
(alle Elemente der "child"-Achse mit dem Namen "abschnitt").
Folgendes Beispiel verdeutlicht, wie das Quelldokument durchlaufen
wird, indem für jede Art von Knoten eine eigene Template-Regel existiert:
b1d.xsl, e1d.xml
Merke:
Es gibt folgende Knotentypen:
/ (Wurzelknoten, hat eine besondere Bedeutung/Verarbeitung)
* (symbolisiert alle Knoten, die Elemente sind)
@* (symbolisiert alle Knoten, die Attribute sind)
text()
comment()
processing-instruction()
Daneben gibt es in XPath noch Namespace-Knoten, deren Konzept jedoch schwer
verständlich ist..
Weitere Erklärungen und Beispiele weiter unten
Übung
Analysieren Sie das Quell-Dokument hinsichtlich seiner Struktur - Welche
Elemente gibt es? Wie sind diese verschachtelt?
Wie kann ich mir alle Überschriften anzeigen lassen?
b2a.xsl e2a.xml
Wie kann ich die Überschriften wieder als Elemente in die Ausgabe
bringen?
b2b.xsl e2b.xml
Wie kann ich jetzt die hierarchische Struktur wieder aufbauen?
b2c.xsl e2c.xml
3. Fortgeschrittenere Muster
Ich interessiere mich nur für das Kapitel Diagnosedaten. Dieser Abschnitt
hat das Attribut FileID="BD284.xml".
b3.xsl e3.xml
Merke:
Mit eckigen Klammern [] wird auf einen Knoten eine Bedingung, ein Prädikat
angewandt. Ist diese Bedingung wahr, so wird der Knoten selektiert. Neben
der Achse und dem Knotentyp ist ein Prädikat der dritte Bestandteil
eines Pfadbestandteils.
Mit @ werden Attribute angesprochen (Abkürzung für "attribute::").
Ich interessiere mich nur für Kapitel (abschnitt), die als "Enkel"
Werte (wert) enthalten.
b3a.xsl e3a.xml
Ich interessiere mich für Kapitel mit der Überschrift "Erster
Therapieschritt".
b3b.xsl e3b.xml
Übung
Suchen Sie alle Abschnitte, die einen Code "X" enthalten.
Begrenzen Sie die Auswahl auf das Kapitel Diagnosedaten.
(Eine) Lösung: b3c.xsl e3c.xml
Ich möchte auch noch das Kapitel Verlaufsdaten dazuhaben.
b3d.xsl e3d.xml
Merke:
In Prädikaten können auch Bedingungen verknüpft werden.
Der erste Code und letzte Code eines Kapitels mit einer Überschrift
Seitenlokalisation?
b3e.xsl e3e.xml
Merke:
Um auf bestimmte Elemente einer Menge von Elementen zuzugreifen kann man
Funktionen benutzen. Für die häufige Funktion [position()=zahl]
gibt es eine kurze Schreibweise, die wie ein Index auf ein Array aussieht
(beginnend mit 1 für das erste Element): [zahl]
In einem select-Attribut kann auch im Baum wieder nach oben gewandert werden.
Übung
Suchen Sie alle Auswahllisten, die 3 Werte zur Auswahl bieten (die Funktion,
um den Index des letzten Elements einer Menge zu bekommen heißt last().)
(Eine) Lösung: b3f.xsl e3f.xml
4. Fortgeschrittenere Ausgaben
Ich möchte das ganze in HTML haben.
b4.xsl e4.htm
Merke:
Die name() Funktion liefert den Namen des Elements
Um auf Funktionen in Attributen zuzugreifen, werden geschweift Klammern
{} benutzt (in Attributen von Ergebnis-Elementen, also solchen, die eine
Ausgabe liefern.
Die Überschriften für die Kapitel und Unterkapitel sollen unterschiedlich
groß sein.
b4a.xsl e4a.htm
Merke:
Um Werte zu berechnen, wie die Überschriften-Tags H1, H2, ... werden
Variablen oder Parameter benötigt.
An Templates können, ähnlich wie an Funktionen, Parameter übergeben
werden.
Der Unterschied von Parametern zu Variablen ist, daß Parameterwerte
(select="...") nur Vorgabewerte sind, die durch übergebene Parameter
(with-param) ersetzt werden.
Mit "value-of" kann auf Werte im Quelldokument zugegriffen werden.
Das Copy-Tag kopiert Elemente einfach, statt sie mit "element" neu zu bilden.
Einführung einer Numerierung..
b4b.xsl e4b.htm
Merke:
Mit "if" und "choose/when/otherwise" kann eine bedingte Verarbeitung realisiert
werden.
Einführung eines Inhaltsverzeichnisses.
b4c.xsl e4c.htm
Merke:
Das Mode Attribut für templates und apply-templates ermöglicht
die mehrfache Verarbeitung von Elementen.
Verknüpfung des Inhaltsverzeichnisses mit den Inhalten über Hyperlinks.
b4d.xsl e4d.htm
Merke:
Mit "if" und "choose/when/otherwise" kann eine bedingte Verarbeitung realisiert
werden.
Übung
Zeigen Sie hinter jeder Überschrift das Attribut "FileID" an, aber
nur, wenn es vorhanden ist.
(Eine) Lösung: b4e.xsl e4e.htm
5. Modulares Design / Style Sheet Import
Wie kann ich Code wiederverwenden, z.B. für die Wertelisten und über
mehrere Stylesheets hinweg gleich gestalten?
b5.xsl e5.htm
Merke:
Templates, die in unterschiedlichen Stylesheets immer wieder auftauchen,
können in ein Stylesheet ausgelagert werden, welches dann mit "include"
wieder eingeschlossen wird.
Bei mehreren gleichen Templates, hat das des einschließenden Dokuments
Vorrang
6. Sortieren und Schleifenverarbeitung
Ein alphabetisch geordnetes Vezeichnis aller Auswahllisten
b6.xsl e6.htm oder b6a.xsle6a.htm
Merke:
Eine Knotenliste kann mit "sort" sortiert werden.
Außer über "apply-templates" kann eine Knotenliste auch über
"for-each" erzeugt und direkt abgearbeitet werden.
Übung
Sortieren Sie den Gebietsschlüssel für die Strahlentherapie (FileID="BD3438w.xml")
nach der Bezeichnung.
(Eine) Lösung: b6b.xsl e6b.htm