Die Kontrolle über das Ergebnisformat
(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 1.)
Anfangs wurde klammheimlich ein HTML-Dokument erzeugt, das Format allerdings nirgendwo explizit angeordnet. Zum Glück ist dies für eine HTML-Ausgabe auch nicht unbedingt notwendig, der Prozessor »merkt« nämlich (in gewissem Rahmen), was beabsichtigt ist.
Erscheint das Element <html> als erstes (höchstens ein Whitespace-Node darf vorausgehen) Literal Result Element in der zuerst verarbeiteten Template-Regel, dann »erkennt« der XSLT-Prozessor, dass ein HTML-Dokument erzeugt werden soll, und schaltet automatisch in diesen Modus um.
Lautet der Bezeichner nicht <html>, sondern beliebig anders, so wird stets ein XML-Dokument erzeugt. Problematisch ist allerdings die Erzeugung eines formal korrekten XHTML-Dokuments. Es wurde bereits gezeigt, dass die Übergabe eines Namensraums hier nicht ausreicht.
Default-Ausgabe in HTML
Die HTML-Ausgabe äußert sich dadurch, dass leere Tags wie <br> oder <hr> im Ergebnisdokument nicht mehr in der XML-Variante <br/> und <hr/>, sondern wie gewohnt (in der SGML-Form) erscheinen – es wird hier also kein wohlgeformtes XML-Dokument erzeugt.
Zudem wird, wie bereits deutlich wurde, ein Meta-Tag hinzugefügt, der den verwendeten Zeichensatz nennt. Es handelt sich, abweichend vom verarbeiteten Quelldokument, um UTF-8, das vom Prozessor verwendete Standard-Encoding:
<html>
<head>
<title>Ergebnisdokument</title>
</head>
<body>
<h1 align="center">Die erste XSLT-Transformation</h1>
<p>Ein Textabsatz. Später mehr.</p>
</body>
</html>
So weit so gut. Was aber, wenn nicht HTML, sondern XHTML erzeugt werden soll? Der Prozessor kann dies nicht »von sich aus« merken. Denn auch ein XHTML-Dokument besitzt <html> als Wurzelelement. Es wird also ein Weg benötigt, um den gewünschten Output direkt zu beschreiben.
Die Deklaration xsl:output
Solange normales HTML erzeugt werden soll und der so erzeugte Quelltext zufriedenstellend ist, muss im Grunde nichts weiter unternommen werden. Für andere Fälle steht eine Deklaration zur Verfügung, die eine ganze Reihe von Parametern für das Ergebnisdokument festlegen kann: xsl:output.
Als Deklaration gehört xsl:output zu den Toplevel-Elementen, wird also als unmittelbares Kindelement von xsl:stylesheet eingesetzt. Die Deklaration steht also auf gleicher Ebene mit den Template-Regeln. Üblicherweise setzt man sie an den Beginn des Stylesheets, doch ist das für ihre Wirkung ohne Belang.
Das method-Attribut von xsl:output
Das wichtigste Attribut, das zur Verfügung steht, ist method. Hiermit wird das gewünschte Ausgabeformat gewählt. Es besitzt vier mögliche Werte: xml, html, text und xhtml.
Um ein XHTML-Dokument zu erzeugen, beginnen Sie folgendermaßen:
Code-Beispiel: kap01/1.07/stylesheet5.xsl.
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0"
...
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xhtml"/>
<xsl:template match="/">
...
</xsl:template>
</xsl:stylesheet>
und erhalten in etwa folgende Ausgabe (hier mit AltovaXML):
Code-Beispiel: kap01/1.07/transformation5_altova.html (leider noch kein XHTML).
<?xml version="1.0" encoding="UTF-8"?>
<html>
<head>
<title>Ergebnisdokument als XHTML</title>
</head>
<body>
<h1 align="center">Die dritte XSLT-Transformation</h1>
<p>Das ist ein Testinhalt aus 'dummy.xml'.<br/> Es funktioniert.</p>
</body>
</html>
Als Erstes fällt die vorangestellte XML-Deklaration ins Auge, die neben dem obligatorischen version-Attribut auch ein encoding-Attribut besitzt. Wollten Sie diese Deklaration unterdrücken, so könnten Sie hierfür in xsl:output das Attribut omit-xml-declaration="yes" setzen. Weiterhin wird deutlich, dass leere Elemente wie <br/> in XML-Schreibweise im Ergebnis erscheinen.
Saxon gibt anstelle von <br/> hier noch <br></br> aus, was von einigen Webbrowsern als zwei aufeinanderfolgende Zeilenumbruchbefehle missverstanden wird. Dies liegt jedoch daran, dass Saxon im XML-Outputmodus arbeitet, solange nicht auch ein XHTML-Namensraum deklariert ist.
Was hier gegenüber der HTML-Ausgabe fehlt, ist die Einrückung der Tags. Das ist zu verschmerzen (und zu korrigieren, siehe unten). Ärgerlich hingegen ist, dass Umlaute nicht durch HTML-Entities ersetzt und für das Ergebnisdokument das Standard-Encoding UTF-8 verwendet wird. Diesem Umstand können Sie mit Hilfe eines weiteren Attributs von xsl:output zu Leibe rücken.
Die vollständige Output-Deklaration für die XHTML-Ausgabe
Um das gewünschte Ergebnis zu erzielen, sind leider eine ganze Reihe von Optionen zu setzen. Zunächst muss xsl:stylesheet der XHTML-Namensraum als Default-Namensraum hinzugefügt werden. Die Deklaration xsl:output erhält die Attribute encoding, indent, doctype-public und doctype-system:
Code-Beispiel: kap01/1.07/stylesheet6.xsl.
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
...
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="xhtml" encoding="ISO-8859-1" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
...
</xsl:stylesheet>
Beim Ergebnisdokument handelt es sich jetzt um korrektes XHTML:
Code-Beispiel: kap01/1.07/transformation6_altova.html (endlich XHTML).
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<title>Ergebnisdokument als XHTML</title>
</head>
<body>
<h1 align="center">Die dritte XSLT-Transformation</h1>
<p>Das ist ein Testinhalt aus 'dummy.xml'.<br /> Es funktioniert. Dies ist jetzt XHTML.</p>
</body>
</html>
Der Namensraum
Es wird gelegentlich empfohlen, den gewünschten XHTML-Namensraum "http://www.w3.org/1999/xhtml" innerhalb des Stylesheets im Wurzelelement <html> unterzubringen. Dies ist ebenso gut und besser als Default-Namensraum in xsl:stylesheet selbst zu realisieren. Diese Version mag also etwas übertrieben sein und bietet keinen Mehrwert:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
...
</html>
</xsl:template>
...
Das encoding-Attribut von xsl:output
Wünscht man ein vom Standard UTF-8 abweichendes Encoding, so lässt sich dies durch ein entsprechendes Attribut veranlassen. Mit dem zusätzlichen encoding-Attribut sieht die Deklaration nun folgendermaßen aus:
<xsl:output method="xhtml" encoding="ISO-8859-1"/>
Auch für die Ausgabe method="html" ließe sich das Encoding anpassen; im eingefügten Meta-Tag steht dann (beispielsweise) charset=ISO-8859-1:
<xsl:output method="html" encoding="ISO-8859-1"/>
Einrückung aktivieren mit dem indent-Attribut
Die vermisste Einrückung kann man sich durch Setzen des indent-Attributs zurückholen. Das Attribut kann die Werte no und yes annehmen:
<xsl:output method="xhtml" indent="yes"/>
Für die Output-Methode html ist der Default-Wert dieses Attributs ausdrücklich "yes", was man auch am Ergebnis sehen konnte. Für eine Textausgabe mit method="text" macht eine Einrückung hingegen keinen Sinn. Das indent-Attribut wird in diesem Fall nicht beachtet.
Für die Methoden xml und xhtml schweigt sich die Spezifikation aus. Empirisch lässt sich feststellen, dass in diesem Fall der Default-Wert "no" sein muss; zumindest Saxon 9 verhält sich dementsprechend. Ob dies für alle Prozessoren gilt, ist schwer zu vorauszusagen. Sofern Sie das Attribut explizit setzen, sind Sie in jedem Fall auf der sicheren Seite.
Die Doctype-Declaration des Ergebnisdokuments
Das Ergebnisdokument kann entweder eine Doctype-Deklaration mit PUBLIC-Identifier (ein Name für die Deklaration) oder mit SYSTEM-Identifier (ein URI-String, unter dem die DTD zu finden ist) erhalten oder sogar beide.
Für ein korrektes XHTML-Dokument sollten beide Identifier vergeben werden. Diese Werte erzeugen ein Dokument XHTML 1.0 strict:
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
Das Ergebnis sieht folgendermaßen aus:
Code-Beispiel: Doctype-Deklaration XHTML 1.0 strict.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Für XHTML 1.0 transitional und XHTML 1.0 frameset müssen analog folgende Doctype-Deklarationen generiert werden:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
Zusammenfassung zu xsl:output
Es gibt noch eine ganze Reihe weiterer Attribute von xsl:output, von denen einige selten oder nur in Zusammenhang mit bestimmten Ausgabemethoden benötigt werden. Eine genaue Erörterung führt hier zu weit. Sie können jedoch unter Referenz der XSLT 2.0-Elemente alles über dieses Element nachlesen. An dieser Stelle soll es genügen, die Deklaration kurz gestreift zu haben. Weitere Aspekte werden unter anderem in Zusammenhang mit der Erzeugung sekundärer Ergebnisdokumente besprochen.
- Die Deklaration xsl:output steuert das Verhalten des XSLT-Prozessors beim Erzeugen des Ergebnisdokuments. Unterlässt man die Deklaration, so besitzt der Prozessor jeweils unterschiedliches Default-Verhalten für die verschiedenen Typen der Ergebnisdokumente.
- Ohne xsl:output versucht der Prozessor, die gewünschte Ausgabemethode anhand des Wurzelelements des Ergebnisdokuments zu erschließen.
- Wird xsl:output gesetzt, so ist es sinnvoll, neben dem method-Attribut explizit auch das encoding- und indent-Verhalten zu definieren und für die XHTML-Ausgabe auch die Doctype-Deklaration zu bestimmen.
Wenden wir uns nun den weiteren Inhalten zu, die neben den Literal Result Elements in einer Template-Regel vorkommen – den XSLT-Instruktionen.
<< zurück | vor >> |
Tipp der data2type-Redaktion: Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: |
Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
Galileo Press, Rheinwerkallee 4, 53227 Bonn