Ausgabe im Ergebnisbaum
Bisher haben wir die Ausgabe des Ereignisbaums durch die „direkte Notation“ der Elemente, Attribute und Textknoten gesteuert. Es gibt dafür aber auch einen anderen Weg. Auf diesen und auf weitere Möglichkeiten zur Steuerung der Ausgabe wollen wir in diesem Thema genauer eingehen.
Elemente
Um in der Ausgabe ein Element zu platzieren, haben wir das Element bisher immer direkt angegeben. Alternativ können wir ein
Element jedoch auch über das XSLT-Element element
erzeugen. Als Attribute stehen uns name
für den
Elementnamen und namespace
für den Namensraum des Elements zur Verfügung. Ein weiteres Attribut (use-attribute-sets
)
wird in Verbindung mit Attributsätzen verwendet. Dazu jedoch im nächsten Abschnitt
mehr. Verwendet wird diese Art der Element-Erzeugung i. d. R. nur bei Verwendung von Attributsätzen oder bei der
Erzeugung einer weiteren XSL-Datei (mit dem gleichen Namensraumpräfix, wie die eigene Datei).
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <?xml-stylesheet href="elemente.xsl" type="text/xsl" ?> <artikel> <titel>Grundlagen von XSLT</titel> <text>Hier lernen Sie die Grundlagen von XSLT ...</text> </artikel>
XSLT-Code:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>Elemente erzeugen - XSLT Code-Beispiel</title> <meta charset="utf-8" /> <meta name="robots" content="noindex,nofollow" /> <meta name="publisher" content="Homepage-Webhilfe" /> </head> <body> <xsl:element name="article"> <xsl:element name="h1"><xsl:value-of select="/artikel/titel" /></xsl:element> <xsl:element name="p"><xsl:value-of select="/artikel/text" /></xsl:element> </xsl:element> </body> </html> </xsl:template> </xsl:stylesheet>
Attribute
Die Erzeugung von Attributen ist mittels des XSLT-Elements attribute
möglich. Der Vorteil dieser Variante gegenüber
der direkten Notation ist, dass die Notation an einer beliebigen Stelle innerhalb des Elements erfolgen kann und der
Wert variabel (also auch aus den XML-Daten stammend) sein kann. Auch das Einschließen des Attribut-Elements in eine
Abfrage ist möglich. Wie auch beim element
-Element gibt es beim attribute
-Element die Attribute
name
und namespace
.
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <?xml-stylesheet href="attribute.xsl" type="text/xsl" ?> <artikel> <titel zentriert="ja">Grundlagen von XSLT</titel> <text> ... </text> </artikel>
XSLT-Code:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>Attribute erzeugen - XSLT Code-Beispiel</title> <meta charset="utf-8" /> <meta name="robots" content="noindex,nofollow" /> <meta name="publisher" content="Homepage-Webhilfe" /> </head> <body> <article> <h1> <xsl:if test="/artikel/titel/@zentriert = 'ja'"> <xsl:attribute name="style">text-align: center;</xsl:attribute> </xsl:if> <xsl:value-of select="/artikel/titel" /> </h1> <p><xsl:value-of select="/artikel/text" /></p> </article> </body> </html> </xsl:template> </xsl:stylesheet>
Um mehrere Attribute zu gruppieren, können Sie das XSLT-Element attribute-set
verwenden. Man spricht hier
von einem Attributsatz. Attributsätze müssen außerhalb von Templates und somit direkt innerhalb des XSLT-Wurzelelements
notiert werden. Über das Attribut name
können Sie einen eindeutigen Namen des Attributsatzes festlegen. Der
festgelegte Name kann dann innerhalb des Attributs use-attribute-sets
in den Elementen element
und
copy
oder einem weiteren attribute-set
-Element verwendet werden. Sollen mehrere Attributsätze verwendet
werden, so sind diese per Leerzeichen zu trennen.
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <?xml-stylesheet href="attribut-satz.xsl" type="text/xsl" ?> <artikel> <titel>Grundlagen von XSLT</titel> <text>Hier lernen Sie die Grundlagen von XSLT ...</text> </artikel>
XSLT-Code:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:attribute-set name="box"> <xsl:attribute name="style">margin: 5px; border: 1px dashed red; padding: 5px;</xsl:attribute> </xsl:attribute-set> <xsl:template match="/"> <html> <head> <title>Attributsätze - XSLT Code-Beispiel</title> <meta charset="utf-8" /> <meta name="robots" content="noindex,nofollow" /> <meta name="publisher" content="Homepage-Webhilfe" /> </head> <body> <xsl:element name="article" use-attribute-sets="box"> <h1><xsl:value-of select="/artikel/titel" /></h1> <p><xsl:value-of select="/artikel/text" /></p> </xsl:element> <br /> <xsl:element name="div" use-attribute-sets="box"> <b>Übrigens:</b> Auf unserer Website gibt es ein ausführliches Tutorial zu XML und XSLT. </xsl:element> </body> </html> </xsl:template> </xsl:stylesheet>
Texte
Möchten Sie einen Textknoten im Ergebnisbaum erzeugen, so können Sie das Element text
verwenden. Bei dieser Variante
bleiben Leerraumzeichen erhalten und werden „unverändert“ in die Ausgabe übertragen. Bisher haben wir „Text“ immer direkt
notiert. Es wäre jedoch keinesfalls falsch, dort das text
-Element zu verwenden. Verwendet wird das Element in der
Realität jedoch meistens nur, um ein einzelnes Leerzeichen in die Ausgabe zu übertragen.
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <?xml-stylesheet href="texte.xsl" type="text/xsl" ?> <dokument> <titel>Text-Knoten erzeugen</titel> </dokument>
XSLT-Code:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>Texte erzeugen - XSLT Code-Beispiel</title> <meta charset="utf-8" /> <meta name="robots" content="noindex,nofollow" /> <meta name="publisher" content="Homepage-Webhilfe" /> </head> <body> <h1><xsl:value-of select="/dokument/titel" /></h1> <i><xsl:text>Dieser Text-Knoten wurde mit xsl:text erzeugt.</xsl:text></i> </body> </html> </xsl:template> </xsl:stylesheet>
Kommentare
Wenn Sie innerhalb eines XSLT-Skripts einen Kommentar (also zwischen den Tags <!--
und -->
)
platzieren, werden Sie feststellen, dass dieser Kommentar nicht im Ausgabebaum erscheint. Dies kann in einigen Situationen erwünscht
sein, in anderen hingegen nicht. Möchten Sie einen Kommentar im Ergebnisbaum erzeugen, so müssen Sie das XSLT-Element
comment
verwenden.
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <?xml-stylesheet href="kommentare.xsl" type="text/xsl" ?> <dokument> <titel>Kommentar-Knoten erzeugen</titel> </dokument>
XSLT-Code:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>Kommentare erzeugen - XSLT Code-Beispiel</title> <meta charset="utf-8" /> <meta name="robots" content="noindex,nofollow" /> <meta name="publisher" content="Homepage-Webhilfe" /> </head> <body> <h1><xsl:value-of select="/dokument/titel" /></h1> <xsl:comment>Dieser Kommentar-Knoten wurde mit xsl:comment erzeugt.</xsl:comment> </body> </html> </xsl:template> </xsl:stylesheet>
Baum kopieren
Um ein Element von der XML-Datei in die Ausgabedatei zu kopieren, können Sie das XSLT-Element copy
verwenden.
Beim Kopiervorgang werden die Tags des Elements sowie der Textinhalt (PCDATA) kopiert. Attribute und untergeordnete Elemente
werden nicht kopiert. Innerhalb des copy
-Elements wird i. d. R. mit dem value-of
-Element ein Knoten
(also der zu kopierende Knoten) selektiert. Des Weiteren können Sie mit Hilfe des Attributs use-attribute-set
dem
Element einen Attributsatz zuweisen.
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <?xml-stylesheet href="kopieren.xsl" type="text/xsl" ?> <dokument> <h1>Knoten kopieren</h1> </dokument>
XSLT-Code:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>Knoten kopieren - XSLT Code-Beispiel</title> <meta charset="utf-8" /> <meta name="robots" content="noindex,nofollow" /> <meta name="publisher" content="Homepage-Webhilfe" /> </head> <body> <xsl:apply-templates /> </body> </html> </xsl:template> <xsl:template match="/dokument/h1"> <xsl:copy><xsl:value-of select="/dokument/h1" /></xsl:copy> </xsl:template> </xsl:stylesheet>
Um einen ganzen XML-Baum zu kopieren, können Sie das einteilige XSLT-Element copy-of
verwenden. Das
copy-of
-Element kopiert das selektierte Element, inkl. den Attributen sowie allen untergeordneten Knoten
(Elementknoten, Textknoten etc.). Den zu kopierenden Knoten legen Sie mit dem select
-Attribut fest.
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <?xml-stylesheet href="kopieren-baum.xsl" type="text/xsl" ?> <dokument> <article> <h1>Grundlagen von XSLT</h1> <p>Hier lernen Sie die Grundlagen von XSLT ...</p> </article> </dokument>
XSLT-Code:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>Baum kopieren - XSLT Code-Beispiel</title> <meta charset="utf-8" /> <meta name="robots" content="noindex,nofollow" /> <meta name="publisher" content="Homepage-Webhilfe" /> </head> <body> <xsl:copy-of select="/dokument/article" /> </body> </html> </xsl:template> </xsl:stylesheet>
Ausgabe steuern
Um ein paar Einstellungen für die Ausgabe bzw. Transformation festzulegen, können Sie das Element output
verwenden.
Zur Konfiguration stehen einige Attribute zur Verfügung:
method | Legt die Art der Ausgabe (xml, html oder text) fest. |
---|---|
media-type | Legt den MIME-Typ für die Ausgabe fest. |
indent | Gibt an, ob untergeordnete Elemente in der Ausgabe eingerückt (yes) werden sollen oder nicht (no). |
version | Legt die Version, welche in der XML-Deklaration verwendet wird, fest. |
encoding | Legt die Zeichenkodierung für den Ergebnisbaum (wird u. a. für die XML-Deklaration verwendet) fest. |
standalone | Legt die Einstellung für den DTD-Bezug (yes oder no) in der XML-Deklaration fest (Vergleich standalone-Attribut in XML). |
omit-xml-declaration | Gibt an, ob die XML-Deklaration weggelassen (yes, Standard) werden soll oder nicht (no). |
Das output
-Element bzw. dessen Einstellungen werden in den XSLT-Prozessoren von Browsern unzureichend
unterstützt. Die meisten XSLT-Prozessoren von Browsern sind nur für die Transformation in HTML geeignet.
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <?xml-stylesheet href="ausgabe.xsl" type="text/xsl" ?> <adressbuch> <kontakt geschlecht="m" alter="17"> <name>Max Mustermann</name> <strasse>Musterstraße 123</strasse> <ort>12345 Musterstadt</ort> <email>max.mustermann@example.com</email> </kontakt> <kontakt geschlecht="w" alter="24"> <name>Maria Musterfrau</name> <strasse>Musterstraße 456</strasse> <ort>67890 Musterhafen</ort> <email>m.musterfrau@example.com</email> </kontakt> <kontakt geschlecht="m" alter="53"> <name>Peter Müller</name> <strasse>Hauptstraße 29</strasse> <ort>27946 Programmierstadt</ort> <email>petra-mueller@example.com</email> </kontakt> </adressbuch>
XSLT-Code:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" omit-xml-declaration="no" version="1.0" encoding="UTF-8" standalone="yes" indent="yes" /> <xsl:template match="/"> <mailliste> <xsl:apply-templates /> </mailliste> </xsl:template> <xsl:template match="kontakt"> <adresse><xsl:value-of select="email" /></adresse> </xsl:template> </xsl:stylesheet>
Wichtig: Beachten Sie, dass wenn Sie auf das Vorschau-Icon „XML (Eingabe)“ klicken, Sie vermutlich kein richtiges Ergebnis sehen werden, da Ihr Browser die Transformation von XML zu XML nicht unterstützt.