xml.seminar.2004 | ![]() |
- Ausarbeitung von Nils Gemeinhardt zum Thema XSLT im Rahmen des XML-Seminar 2004 -
AllgemeinesXSLT steht für Extensible Stylesheet Language Transformation und wurde im November 1999 vom W3C als Empfehlung herausgegeben. Mit XSLT kann das Aussehen von Dokumenten festgelegt werden.Ziel ist es, mit Hilfe eines XSLT-Prozessors, einen Quellbaum (meist XML) in einen Zielbaum zu überführen. Dabei ist die Art des Zieldokuments sehr flexibel: es ist zum Beispiel möglich ein HTML-Dokument, eine XML-Datei oder eine Ausgabe für ein Handy (Wap) zu erzeugen. Neue Browserversionen haben die Möglichkeit XML-Dateien zusammen mit einer XSLT-Datei entsprechend darzustellen. Die Zuweisung eines XSLT-Dokuments zu einer XML-Datei muss entweder beim Aufruf des XSLT-Prozessors geschehen, oder kann in der XML-Datei festgelegt werden: <?xml-stylesheet type="text/xsl" href="gruss.xsl" ?> Die Ansteuerung der einzelnen Dokument-Knoten geschieht über XPath. AufbauDa es sich bei dem XSLT-Dokument um eine normale (wohlgeformte) XML-Datei handelt, ist der Grundaufbau wie jede XML-Datei und beginnt folgendermaßen:<?xml version="1.0" encoding="iso-8859-1"?> Die Style-Informationen werden mit folgendem Tag umschlossen: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> ... </xsl:stylesheet> Der Ausdruck <xsl:transform ..> ist gleichbedeutend - kann also ebenfalls verwendet werden. BefehleDies ist nur eine kleine Auswahl der möglichen Befehle. Deshalb wurde darauf verzichtet für jeden Befehl alle Atttribute zu nennen. Es werden nur die, für den Anfang, Wichtigsten beschrieben.xsl:outputDurch xsl:output legt man die Art und die Formatierung des Ausgabedokumentes fest.Das Atttribut method kann die Werte xml, html und text annehmen. Diese Werte entscheiden über den Inhalt der Kopfzeilen des Zieldokumentes. Bei XML-Dokumenten muss zusätzlich noch omit-xml-declaration="yes" gesetzt werden. Durch das Atttribut encoding kann der Zeichsatz des Zieldokumentes festgelegt werden. Das Attribut indent kann sehr hilfreich sein, da hierdurch festgelegt wird, dass untergeordnete Elemente automatisch weiter eingerückt werden (dient nur zur besseren Lesbarkeit).
XSLT-Dokument
<xsl:output method="xml" indent="yes" encoding="ISO-8859-1" omit-xml-declaration="yes" /> Erklärung Da method="xml" und xml-declaration="yes" gesetzt sind, wird im Ergebnisbaum die XML-Deklaration (<?xml .. ?>) stehen. Außerdem werden die Elemente automatisch eingerückt. xsl:textStatische Texte im Ergebnisdokument können durch xsl:text geschrieben werden. Durch das Attribut disable-output-escaping kann man festlegen was mit den beiden Zeichen '<' und '>' geschehen soll. Im Normalfall würden diese bedeuten, dass ein neuer Tag begonnen bzw. geschlossen wird. Um dabei Probleme zu vermeiden, sollte man diese Zeichen eigentlich (genauso wie alle Sonderzeichen) in der, aus HTML bekannten, Form schreiben.Wenn man disable-output-escaping = "yes" setzt, dann ist es auch möglich, diese Zeichen ("<" ">") ohne Ersetzen zu nutzen.
<xsl:text>
Schönen guten Tag. </xsl:text> xsl:value-ofMit xsl:value-of kann man entweder auf den Inhalt eines Knotens (Auswahl durch select) oder einer Variable zugreifen und ausgeben. Das Attribut disable-output-escaping (siehe xsl:text) ist auch hier wieder möglich.
XML-Dokument
<p>ein Absatz</p> <p>noch ein Absatz</p> XSLT-Dokument <xsl:template match="p"> <xsl:copy><xsl:value-of select="." /></xsl:copy> </xsl:template> Erklärung Die p-Tags werden einfach zum Enddokument durchgereicht, ohne Veränderung. xsl:templateEine XSLT-Datei besteht im Wesentlichen aus einer Anreihung von "Schablonen", sogenannten Templates. Diese werden über xsl:template definiert.Es gibt 2 Arten von Templates. Die einen beziehen sich auf einen Knoten (z.B. <xsl:template match="titel">) und andere können über einen Namen aufgerufen werden (z.B. <xsl:template name="style1">). Das Attribut match legt fest für welchen Knoten diese Schablone gilt.
XML-Dokument
Ein Template mit dem Attribut name kann mithilfe von xsl:call-template aufgerufen werden.
<text> <fett>fettgeschrieben</fett> </text> XSLT-Dokument <xsl:template match="fett"> <b><xsl:value-of select="." /></b> </xsl:template> Erklärung An der Stelle, an der sich der Tag <fett></fett> befindet, wird im Ausgabedokument der Tag <b></b> stehen.
<xsl:template match="kontakt">
Bei xsl:template gibt es noch das Attribut mode. (siehe xsl:apply-templates)
<xsl:value-of select="." /> <xsl:call-template name="Label" /> <xsl:value-of select="@mail" /> </xsl:template> <xsl:template name="Label"> <b>Mail: </b> </xsl:template> Erklärung Erst wird der Wert des "kontakt"-Tags ausgegeben. Danach wird das Template "Label" aufgerufen - dieses schreibt dick "Mail:" aus. Danach geht es mit der Abarbeitung des ersten Templates weiter und es wird der Wert des Attributs "mail" ausgegeben. xsl:call-templateDass xsl:call-template ein Template aufruft, haben wir schon bei xsl:template erfahren. In den meisten Fällen reicht dies aber nicht, denn man möchte dem aufgerufenen Template Werte mit übergeben. Dies ist mithilfe von xsl:with-param möglich.
<xsl:call-template name="schleife">
<xsl:with-param name="anzahl" select="'101'" /> (oder: <xsl:with-param name="anzahl">101 </xsl:with-param>) </xsl:call-template> <xsl:template name="schleife"> <xsl:param name="anzahl"/> ... Erklärung Das Template "schleife" wird aufgerufen und bekommt dann die Variable "anzahl" mit dem Wert 101 übergeben. In dem aufgerufenen Template kann man dann durch xsl:param die übergebene Variable verfügbar machen. xsl:apply-templatesEin Knoten kann beliebig viele Kindknoten haben. Mit Hilfe von xsl:apply-templates kann man den XSLT-Prozessor anweisen, die untergeordneten Templates aufzurufen. Hierdurch ist es möglich festzulegen, in welcher Reihenfolge die Templates abgearbeitet werden sollen. Auch hier gibt es wieder die Möglichkeit, über das Attribut select festzulegen für welche Tags dieser Aufruf gilt.
XML-Dokument
Mit Hilfe von mode kann man die Auswahl weiter einschränken, da nun auch der Modus übereinstimmen muss.
<text> <h>Überschrift</h> </text> XSLT-Dokument <xsl:template match="/brief"> <html> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="h"> <h1><xsl:value-of select="." /></h1> </xsl:template> Erklärung Würde die Anweisung <xsl:apply-templates/> nicht an dieser Stelle stehen, dann würde im Enddokument nur das HTML-Konstrukt stehen. Durch <xsl:apply-templates/> wird der XSLT-Prozessor angewiesen außerhalb/unterhalb des Templates nach den Anweisungen für die Kindknoten zu "suchen".
XSLT-Dokument
<xsl:apply-templates select="currency" mode="basic"/> ... <xsl:template match="currency"> <xsl:text>dieses Template wird nicht ausgeführt !</xsl:text> <xsl:value-of select="."/> </xsl:template> <xsl:template match="currency" mode="basic"> <xsl:value-of select="."/> </xsl:template> Erklärung Nur das zweite Template wird angewendet, da nur hier der Knotenname und der Modus übereinstimmen. xsl:ifNatürlich gibt es in XSLT, wie in fast jeder Programmier- oder Skriptsprache, die Möglichkeit über Bedingungen die Ausgabe dynamisch zu steuern. Durch das Attribut "test" wird die Bedingung, auf die geprüft werden soll, ausgedrückt.
XML-Dokument
Der große Nachteil bei dem xsl:if-Befehl ist, dass kein else möglich ist. So etwas lässt sich dann nur über die Funktion xsl:choose realisieren.
<ergebnisse> <punkte>100</punkte> <punkte>200</punkte> <punkte>300</punkte> </ergebnisse> XSLT-Dokument <xsl:template match="ergebnis"> <xsl:if test="punkte <= 200"> <li> <xsl:apply-templates /> </li> </xsl:if> </xsl:template> Erklärung Nur wenn der Wert von "punkte" größer als 200 ist, wird es im Enddokument ausgegeben. In diesem Fall erscheint nur die 300. xsl:chooseWenn auf einen Wert nicht nur ein Vergleich angewendet werden soll, dann ist xsl:choose zu nutzen. Hierbei könne mit Hilfe von xsl:when eine Reihe von Bedingunen festgelegt werden, und durch xsl:otherwise wird bestimmen was passiert, wenn keine der When-Bedingungen erfüllt war.
XML-Dokument
<ergebnisse> <punkte>100</punkte> <punkte>200</punkte> <punkte>300</punkte> </ergebnisse> XSLT-Dokument <xsl:template match="punkte"> <xsl:value-of select="." /> <xsl:variable name="wert" select="." /> <xsl:choose> <xsl:when test="$wert < 150"> <xsl:text> ein schlechtes Ergebniss</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text> ein gutes Ergebniss</xsl:text>> </xsl:otherwise> </xsl:choose> </xsl:template> xsl:for-eachIn einem Element können immer mehrere Kindelemente des gleichen Namens auftreten. Um diese "abzuarbeiten" bietet sich eine Schleife an, welche mit dem Befehl xsl:for-each beschrieben wird. Dabei lässt sich mit dem Attribut select festlegen auf welche Menge von Knoten sich bezogen wird.
XML-Dokument
<klasse> <schueler>Hans Bentop</schueler> <schueler>Anika Doll</schueler> <schueler>Phillip Kleiber</schueler> </klasse> XSLT-Dokument <xsl:template match="klasse"> <xsl:for-each select="schueler"> <xsl:value-of select="." /><br /> </xsl:for-each> </xsl:template> Erklärung Der XSLT-Prozessor geht nun jedes Kindelement von "klasse" mit dem Namen "schueler" durch und gibt es aus. xsl:sortEinfach jedes Element so auszugeben wie es im XML-Dokument steht, reicht in den meisten Fällen nicht aus. Es ist zum Beispiel sinnvoll, die Elemente zu sortieren - dies ist mit xsl:sort möglich. Durch das Attribut "select" wählt man die zu sortierenden Elemente/Knoten und durch order die Reihenfolge der Sortierung.Durch die Attribute case-order und lang wird festgelgt, wie bei der Sortierung von Groß- und Kleinbuchstaben bzw. bei Sonderzeichen wie ä, ö und ü vorgegangen werden soll. Zu beachten ist der Datentyp der zu sortierenden Elemente - dieser wird über data-type festgelegt.
XML-Dokument
<spieler><name>Florian</name><punkte>9</punkte></spieler> <spieler><name>Max</name><punkte>11</punkte></spieler> <spieler><name>Klaus</name><punkte>1</punkte></spieler> XSLT-Dokument <xsl:for-each select="spieler"> <xsl:sort select="punkte" data-type="number" /> <xsl:value-of select="name" /><br /> </xsl:for-each> Erklärung Die Namen werden nun in Reihenfolge der erreichten Punkte geordnet (Klaus, Florian, Max). Würde jedoch die Option data-type="number" nicht da stehen, dann würde die Folge so aussehen: Klaus, Max, Florian. Dies liegt daran, dass bei der Ordnung vom Typ "text" zeichenweise verglichen wird. xsl:import / xsl:includeUm eine XSLT-Datei besser strukturieren zu können, bietet es sich an, diese in einzelne Dateien aufzuteilen und dann in einer Datei zusammen zu setzen. Hierfür stehen in XSLT 2 Möglichkeiten zur Verfügung: xsl:import und vxsl:include.Der Unterschied zwischen xsl:import und xsl:include liegt darin, dass bei einem Konflikt (z.B. 2 Templates mit selbem Namen) xsl:import die bestehenden Templates überschreibt. Bei xsl:include werden die Templates "dazu kopiert" - dies kann zur Folge haben, dass entweder ein Konflikt auftritt, oder nur eines der beiden Templates wirkt. Dabei haben die Templates der aktuellen Datei Vorrang vor denen, die importiert werden. Quellen / Links
|
|
![]() |