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: Ausgabemethoden
b1a.xsl, b1b.xsl, b1c.xsl,
e1a.txt, e1b.txt, e1c.txt,
Merke:

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