xsl:output

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 6.)

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

 

Die Deklaration xsl:output wird eingesetzt, um das Ausgabeformat des Stylesheets für die Serialisierung eines Ergebnisdokuments genauer zu bestimmen. Hierfür stehen eine Reihe von Attributen zur Verfügung, die den Serialisierungsparametern entsprechen, und deren wichtigstes, method, dazu dient, den Dokumenttyp des Ergebnisdokuments festzulegen.

Klassifizierung Deklaration
Funktionsgruppe Ausgabeformatdefinition
Einführung XSLT 1.0

Position im Stylesheet und erlaubte Inhalte:

xsl:output tritt als Toplevel-Element als unmittelbares Kindelement von xsl:stylesheet bzw. xsl:transform auf. Ein Stylesheet darf beliebig viele xsl:output-Deklarationen enthalten. Das Element ist stets leer.

Attribute:

Für xsl:output gelten die Standardattribute mit Ausnahme des Standardattributs version, das hier in anderer Funktion als elementspezifisches Attribut definiert ist. (Anmerkung: Dies ist aus Gründen der Rückwärtskompatibilität der Fall. In XSLT 1.0 war das version-Attribut etabliert, bevor in XSLT 2.0 das gleichnamige Standardattribut eingeführt wurde. Das korrespondierende Attribut von xsl:result-document nennt sich jedoch output-version, um einen ähnlichen Namenskonflikt zu vermeiden.)

Die Deklaration besitzt darüberhinaus neun (XSLT 1.0) bzw. sechzehn (seit XSLT 2.0) Attribute, um das Ausgabeformat eines Ergebnisdokuments genau zu bestimmen. Wichtiger Neuzugang in XSLT 2.0 ist das name-Attribut zur Benennung einer Output-Deklaration, was zu deren Verknüpfung mit einer xsl:result-document-Instruktion erforderlich ist.

Für keines der Attribute ist die Verwendung von Attributwert-Templates erlaubt. Die Attribute entsprechen den in der Spezifikation »XSLT 2.0 and XQuery 1.0 Serialization« eingeführten Serialisierungsparametern.

byte-order-mark

Wert

"yes" | "no"

Verwendung

Optional

Einführung

XSLT 2.0

Mit Hilfe des byte-order-mark-Attributs wird festgelegt, ob am Anfang der ausgegebenen Datei eine Byte-Order-Marke (BOM) gesetzt werden soll, oder nicht. Es gibt keinen Defaultwert – vielmehr hängt das automatische Setzen oder Nichtsetzen einer solchen Markierung bei Abwesenheit des Attributs vom verwendeten Encoding ab. Mittels des byte-order-mark-Attributs kann jedoch eine Marke explizit erzwungen oder unterdrückt werden.

Die eigentliche BOM besteht aus dem Unicode-Zeichen U+FEFF (zero width no-break space), das an den Anfang der Ressource gesetzt wird. Je nach Kodierung wird dieses Zeichen durch eine bestimmte Bytefolge umgesetzt, aus der das Encoding für eine verarbeitende Anwendung ersichtlich ist (siehe Tabelle).

Aufgabe der Marke ist es, einer Anwendung, die die Ressource einliest, Auskunft über deren Encoding zu geben (oft kann die Anwendung dies auch selbstständig aus den ersten Zeichen der Ressource entnehmen). Bedeutsam ist dies vor allem bei den Encodings UTF-16 (zwei Bytes pro Zeichen) und UTF-32 (vier Bytes pro Zeichen), wo zwischen »Big Endian« und »Little Endian« Encoding unterschieden werden muss. (Anmerkung: Intel-CPUs verwenden zur Speicherorganisation intern das Little Endian Format, diejenigen von Motorola dagegen Big Endian. Auch die Programmiersprache Java favorisiert Big Endian.)

Hierbei geht es um die Reihenfolge, in der die Bytes, aus denen sich ein Zeichen zusammensetzt, gespeichert werden – höchstwertige (Big Endian) oder niederwertige Bits zuerst (Little Endian). In UTF-32 werden zwei der hier vier Bytes durch Nullwerte aufgefüllt. (UTF-32 ist quasi identisch mit dem in ISO 10646 geregelten UCS-4 – eine BOM besitzt also die gleiche Form.)

Kodierung Bytefolge des BOM

UTF-8

EF BB BF

UTF-16, big-endian

FE FF

UTF-16, little-endian

FF FE

UTF-32/UCS-4, big-endian

00 00 FE FF

UTF-32/UCS-4, little-endian

FF FE 00 00

Tabelle: BOM-Bytefolgen in verschiedenen Zeichenkodierungen (Quelle: Wikipedia).

Ist das Encoding UTF-16, so lautet der Defaultwert "yes", ist es UTF-8 so ist der Wert abhängig von der vorliegenden Implementierung (UTF-8 benötigt kein BOM). Für alle anderen Encodings lautet der Defaultwert "no". In Nicht-Unicode-Formaten existieren keine BOM.

Hinweis: Das Attribut existiert nicht in XSLT 1.0.

cdata-section-elements

Wert

qnames

Verwendung

Optional

Einführung

XSLT 1.0

Das cdata-section-elements-Attribut ist in Verbindung mit method="xml" erlaubt. Es nennt in Form einer durch Leerzeichen getrennten Liste die QNames all jener Elemente, deren enthaltene Textnodes im XML-Ergebnisdokument innerhalb von CDATA-Sections ausgegeben werden sollen:

<![CDATA[ ... Textnode ... ]]>

Dies ist sinnvoll, wenn für Teilabschnitte des Inhalts keine Maskierung von Markup, Sonder- oder Steuerzeichen gewünscht wird, oder um Inhalte auszugeben, die die Wohlgeformtheit des Ergebnisdokuments beeinträchtigen könnten (z.B. Javascript-Code). Speziell für die Ausgabe von XHTML-Dokumenten gilt dies für die Container <script> und <style>.

doctype-public

Wert

string

Verwendung

Optional

Einführung

XSLT 1.0

Das doctype-public-Attribut benennt in Verbindung mit dem doctype-system-Attribut den zusätzlichen, optionalen PUBLIC-Identifier einer Doctype-Deklaration. Das Attribut kann sinnvoll in Zusammenhang mit allen Ausgabemethoden eingesetzt werden, die eine Doctype-Deklaration zulassen, also "xml", "html" und (seit XSLT 2.0) "xhtml". Andernfalls wird es ignoriert.

Hinweis: Ist nicht gleichzeitig das doctype-system-Attribut gesetzt, so wird das doctype-public-Attribut ignoriert.

doctype-system

Wert

string

Verwendung

Optional

Einführung

XSLT 1.0

Das doctype-system-Attribut dient zur Vergabe eines potenziellen SYSTEM-Identifiers in Form eines URI-Strings, der in der Doctype-Deklaration des Ergebnisdokuments verwendet werden soll. Das Attribut kann sinnvoll in Zusammenhang mit allen Ausgabemethoden eingesetzt werden, die eine Doctype-Deklaration zulassen, also "xml", "html" und (seit XSLT 2.0) "xhtml". Andernfalls wird es ignoriert.

Hinweis: Ist ein doctype-system-Attribut gesetzt, so kann auch zusätzlich das doctype-public-Attribut verwendet werden.

encoding

Wert

string

Verwendung

Optional

Einführung

XSLT 1.0

Das encoding-Attribut legt das im Ergebnisdokument gültige Zeichenencoding fest, das die Binärkodierung der Zeichendaten beschreibt (Beispiel: UTF-8, ISO-8859-1). Die erlaubten Werte nennen gültige Encodingformate (charsets), wie sie nach RFC 2278 bei der IANA registriert sind. Charset-Bezeichner werden unabhängig von ihrer Schreibweise mit Groß- oder Kleinbuchstaben erkannt, d.h. der Attributwert ist nicht »case-sensitive« (Beispiel: UTF-8 und utf-8 sind äquivalent).

Wird das gewünschte Encoding nicht erkannt oder vom XSLT-Prozessor nicht unterstützt, so wird auf UTF-8 als Standard-Encoding zurückgegriffen. Die Verwendung des encoding-Attributs ist in Zusammenhang mit allen Werten von method zulässig.

escape-uri-attributes

Wert

"yes" (Default) | "no"

Verwendung

Optional

Einführung

XSLT 2.0

Das escape-uri-attributes-Attribut legt fest, ob die Werte von Attributen vom Typ xs:anyURI in HTML- oder XHTML-Ergebnisdokumenten escaped werden sollen oder nicht. Im Allgemeinen wird ein Escaping als sinnvoll erachtet – der Defaultwert des Attributs ist daher "yes".

Escaping wird gemäß der in RFC 2396 (section 2.4.1) empfohlenen Methode vorgenommen. Nicht darstellbare Zeichen werden also durch ein Hexzahlenpärchen mit vorangestelltem %-Zeichen ersetzt (Beispiel: ein Leerzeichen wird zu %20). Neben Leerzeichen müssen Steuerzeichen und innerhalb eines URIs als Trenner (Delimiter) benötigte Zeichen escaped werden, wenn man sie in ihrer literalen Form benötigt, darunter auch das Prozentzeichen selbst: <, >, #, %, ".

Hinweis: Das Attribut existiert nicht in XSLT 1.0.

include-content-type

Wert

"yes" (Default) | "no"

Verwendung

Optional

Einführung

XSLT 2.0

Mit Hilfe des include-content-type-Attributs kann festgelegt werden, ob der XSLT-Prozessor dem Ergebnisdokument einen Meta-Tag mit einer content-type-Description ähnlich dem folgenden hinzufügen soll:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Das Attribut kann für HTML- oder XHTML-Output verwendet werden, der Defaultwert ist "yes".

Hinweis: Das Attribut existiert nicht in XSLT 1.0.

indent

Wert

"yes" | "no"

Verwendung

Optional

Einführung

XSLT 1.0

Das indent-Attribut legt – für den XSLT-Prozessor allerdings unverbindlich – fest, ob im Quelltext des Ergebnisdokuments Einrückungen erfolgen sollen oder nicht. Der Defaultwert ist "yes" für die Ausgabe in den Formaten »html« und »xhtml«. Für die Ausgabe als »xml« ist der Defaultwert hingegen "no", da Whitespace hier zunächst stets als »inhaltlich relevant« betrachtet wird. Für die Ausgabemethode »text« ist das indent-Attribut nicht anwendbar.

Die für Einrückungen erforderliche, gezielte Einfügung von Whitespace-Nodes darf (ohne das Dokument inhaltlich zu verändern) ohnehin nur zwischen Elementen vorgenommen werden. Hierbei können dort bereits vorhandene Whitespace-Nodes gegebenenfalls ersetzt werden.

Innerhalb von oder angrenzend an Textnodes dürfen Einrückungen dagegen nicht erfolgen, da das Hinzufügen von Whitespace in diesem Fall den Inhalt verändern würde (ganz trivial z.B. die Zeichenzahl eines Textnodes).

Ebenso wenig darf Whitespace in jenen Abschnitten des Ergebnisdokuments hinzugefügt werden, für die ein xml:space-Attribut mit Wert "preserve" gilt. Darüber hinaus hat das indent-Attribut keinen Einfluss auf bereits im Ergebnisdokument vorhandenen Leerraum, nimmt also im Vorfeld einer erfolgenden Einrückung weder eine Normalisierung noch ein Whitespace-Stripping vor.

Hinweis – weitere Whitespacezeichen in XML 1.1
XML 1.1 erweitert den Vorrat an Whitespacezeichen um das NEL-Zeichen (Newline, U+0085 bzw. #x85) aus dem IBM-Mainframe-Bereich sowie um das Unicode-Zeilentrennzeichen #x2028. Bisher durften diese in XML-Dokumenten nicht enthalten sein, weshalb XML 1.1-Dokumente auch keine wohlgeformten XML 1.0-Dokumente darstellen.

media-type

Wert

string

Verwendung

Optional

Einführung

XSLT 1.0

Das media-type-Attribut dient dazu, dem Ergebnisdokument eine entsprechende MIME-Typangabe beizufügen, die beispielsweise bei einer Übertragung des Dokuments per HTTP erforderlich sein kann. Es kann in Zusammenhang mit allen Werten von method eingesetzt werden. Das Attribut beeinflusst nicht den Inhalt des Ergebnisdokuments, sondern, in Abhängigkeit von der Laufzeitumgebung, lediglich dessen Dateieigenschaften für Speicherung bzw. Weitergabe.

Für alle Ausgabeformate liegen Defaultwerte vor, die dann in Kraft treten, wenn das media-type-Attribut weggelassen wird. Der Defaultwert lautet für XML-Ausgabe "text/xml", für HTML- und XHTML-Ausgabe ist es "text/html", für reine Textausgabe "text/plain".

method

Wert

"xml" | "html" | "text" | qname-but-not-ncname
ab XSLT 2.0 auch: "xhtml"

Verwendung

Optional

Einführung

XSLT 1.0 (Wertebereich erweitert in XSLT 2.0)

Das method-Attribut legt den Dokumenttyp des Ergebnis­dokuments fest. Als Vorgabewerte sind hier "xml", "html" und "text" gestat­tet. Seit XSLT 2.0 ist "xhtml" als eigenständiges Ausgabeformat hinzugekom­men. (Dieses Format war bereits unter XSLT 1.0 über den Umweg mit method="xml" unter Verwendung von <html> als Wurzelelement darstellbar.)

Wird kein method-Attribut spezifiziert, so wird automatisch das Format "xml" ausgegeben, es sei denn, der Name des Wurzelelements des Ausgabebaums (final result tree) lautet <html> – in diesem Fall wird das Format "html" gewählt. Befindet sich jenes Wurzelelement zusätzlich im XHTML-Namensraum, so lautet das Format "xhtml" (erst ab XSLT 2.0; für Styleshees in XSLT 1.0 weicht der Prozessor auf das Format "xml" aus).

Hinweis: Weitere, durch QName mit Namensraumpräfix benannte Ausgabe­formate, können durch den jeweiligen Hersteller des XSLT-Prozessors imple­mentiert werden – hierfür existiert die Option qname-but-not-ncname. Wird das Attribut eingesetzt, ihm aber keiner der festgelegten Werte und auch kein QName mit Präfix übergeben, so ist dies ein statischer Fehler (ERR XTSE1570).

method="xml"
Dieser Attributwert dient dazu, explizit XML als Ausgabe­format zu fordern. Grundsätzlich ist XML allerdings ohnehin Defaultausgabe­format für all jene Fälle, in denen das Wurzelelement des auszugebenden Dokuments nicht <html> lautet. In jenem Fall entscheidet der Namensraum des Wurzelelements, ob es, falls kein method-Attribut vorliegt, als "xhtml" oder "html" ausgegeben wird.

Die Ausgabemethode "xml" ist erforderlich, wenn XML-Dokumente oder »external general parsed Entities« erzeugt werden sollen, die einen XML-Prolog bzw. eine Textdeklaration erhalten sollen.

Default-Mediatype in Zusammenhang mit dem Ausgabeformat "xml" ist "text/xml". Mittels des doctype-system- und doctype-public-Attributes kann eine Doctype-Deklaration hinzugefügt werden (nicht jedoch eine interne Untergruppe einer DTD).

method="xhtml" (neu in XSLT 2.0)
In XSLT 1.0 konnten XHTML-Doku­mente nur über den Umweg method="xml" erzeugt werden, da auch diese das Wurzelelement <html> besitzen und hierdurch nicht ohne weiteres vom Aus­gabetyp "html" unterschieden werden konnten. Der lokale Name html des Wurzelelements muss, anders als beim Format "html", zwingend in Klein­buchstaben geschrieben sein.

In XSLT 2.0 liegt ein eigenständiger Ausgabetyp "xhtml" vor, wobei der Namensraum des auszugebenden Wurzelelements berücksichtigt wird: Ent­spricht dieser mit "http://www.w3.org/1999/xhtml" dem XHTML-Namens­raum, dann ist der Default-Output auch ohne ausdrückliche Formatnennung "xhtml".

Will man XHTML-Dokumente der Typen »strict«, »transitional« oder »frameset« ausgeben, die einen von diesem Standardnamensraum abweichenden Namensraum verwenden, so empfiehlt sich daher die tatsächliche Angabe von method="xhtml".

Der Mediatype nimmt genau wie für "html" den Defaultwert "text/html" an. Alternativ kann über das Attribut media-type auch der Wert "text/xml", "application/xhtml+xml" oder "application/xml" gewählt werden. Es wird ein Meta-Tag zur Contentbe­schreibung mit diesem Mediatyp eingefügt, falls nicht das include-content-type-Attribut mit Wert "no" verwendet wird:

<meta http-equiv="Content-Type" content="text/html; charset= EUC-JP">

Als charset-Attributwert steht der Wert des encoding-Attributs, der auch in der XML-Deklaration des XHTML-Dokuments berücksichtigt wird.

Die Ausgabe der leeren HTML-Tags erfolgt – anders als beim Format "html" – XML-konform. Der Prozessor ist (derzeit) angehalten, vor dem abschlie­ßenden Slash ein Leerzeichen in die Marke einzufügen, um Abwärtskompatibili­tät zu gewährleisten.

Beispiel: <br /> statt <br/>.

Elemente, deren Inhaltsmodell nicht EMPTY ist, sollen jedoch keinesfalls in verkürzter Form dargestellt werden, auch wenn von ihnen eine leere Instanz erzeugt wird.

Beispiel: leerer Absatz immer als <p></p>, nie als <p />.

Im Gegensatz zu reinem XML-Output soll der Prozessor Zeilenumbrüche inner­halb von erzeugten oder kopierten Attributwerten entfernen und zu einem Leerzeichen normalisieren.

Leerzeichen und Sonderzeichen innerhalb von Werten von URI-Attributen wie href oder src werden automatisch gemäß den Richtlinien für URI-Escaping (RFC 3236) maskiert. Auf Wunsch kann dies mittels des Attributs escape-uri-attributes auch deaktiviert werden. (Dies macht nur dann Sinn, wenn über die XPath 2.0-Funktion fn:escape-html-uri() eine vom Standard-Escaping abweichende Variante gewählt werden soll.)

Eine Ausgabe konform zu XHTML Strict, XHTML Transitional, XHTML Frame­set oder XHTML Basic zu gewährleisten, ist Aufgabe des Stylesheet-Autors. Für den Prozessor stellen Abweichungen hiervon keinen zu meldenden Fehler dar. Mittels doctype-public und doctype-system können allerdings entspre­chende Doctype-Deklarationen eingefügt werden, um eine anschließende Vali­dierung des Ergebnisdokuments zu ermöglichen.

method="html"
Das Ausgabeformat "html" ist dann Defaultwert, wenn das Wurzelelement des Ergebnisdokuments einen Null-Namensraum und den Bezeichner <html> hat, wobei dieser sich beliebig aus Groß- und Kleinbuchsta­ben zusammensetzen darf. Innerhalb des Ergebnisdokuments werden alle Ele­mente mit Null-Namensraum wie HTML-Elemente nach HTML 4.0 ausgege­ben.

Leere HTML-Elemente werden nicht nach XML-Regeln, sondern ohne Endtag ausgegeben, sodass das Ergebnis in der Regel kein wohlgeformtes XML sein wird – die Erkennung der hierfür in Frage kommenden Elemente soll unabhän­gig von ihrer Schreibweise im Quelldokument oder Stylesheet sein (z.B. <BR/>, <br></br>, <br/> werden gleichermaßen als <br> ausgegeben).

An jenen Stellen, an denen laut HTML 4.0 minimierte (boolesche) Attribute erlaubt sind, werden diese minimiert ausgegeben

Beispiel: <hr noshade="noshade"/> ergibt <hr noshade>.

Steuerzeichen oder Zeichen, die im gewählten Ausgabeencoding nicht enthal­ten sind, werden durch die entsprechenden HTML-Entities ersetzt. Existiert kein solches Entity, wird das Zeichen durch ein (numerisches) Character Entity wiedergegeben. Innerhalb von auszugebenden <script>- oder <style>-Ele­menten soll ein solches Escaping jedoch unterbleiben.

method="text"
Das Ausgabeformat "text" gibt den Stringwert des Wur­zelelements des Queldokuments aus, mit anderen Worten den Textinhalt aller Elemente in Dokumentreihenfolge. Ein Escapen von Sonderzeichen findet nicht statt. Abgesehen von den Textknoten des Quelldokuments werden alle anderen Knotentypen – also auch Attributwerte – ignoriert. Das Zeichen, das ein Zeilenende repräsentiert, wird in Abhängigkeit von der Systemumgebung gewählt, in der das Dokument erzeugt wird.

In Zusammenhang mit method="text" werden als weitere Attribute lediglich media-type, encoding und unicode-normalisation erkannt. Sind andere Attribute gesetzt, so werden sie ignoriert.

Das media-type-Attribut nimmt den Defaultwert "text/plain" an, für das encoding-Attribut ist der Defaultwert in diesem Zusammenhang systemabhän­gig. Enthält der auszugebende Text Zeichen, die im gewählten Encoding (oder dem Default-Encoding) nicht enthalten sind, wird jedoch in jedem Fall ein Feh­ler gemeldet.

Keine »external general parsed entities« mit method="text" erzeugbar
»External general parsed entities«, die aus Plaintext mit einer voran­gestellten Textdeklaration ähnlich <?xml version="1.0"?> bestehen, können nicht mit der Ausgabemethode "text", sondern müssen mit der Methode "xml" erzeugt werden. Es gibt keine Möglichkeit, in Zusammen­hang mit dem Ausgabeformat "text" eine Textdeklaration auszugeben.

name

Wert

QName

Verwendung

Optional

Einführung

XSLT 2.0

Das name-Attribut dient zur Benennung einer xsl:output-Deklaration. Im Rahmen der Erzeugung mehrerer Ergebnisdokumente durch xsl:result-document kann ein benanntes Ausgabeformat jedem dergestalt erzeugten Dokument zugewiesen werden. Liegen mehrere gleich benannte xsl:output-Deklarationen innerhalb eines Stylesheets vor, so werden sie zu einer einzigen Deklaration verschmolzen.

Die xsl:result-document-Instruktion bezieht sich auf eine Output-Deklaration mit Hilfe ihres format-Attributs. Ist in einer xsl:result-document-Instruktion kein format-Attribut vorhanden, so bezieht sie sich auf die unbenannte Output-Deklaration des Stylesheets.

Hinweis: Das Attribut existiert nicht in XSLT 1.0.

normalisation-form

Wert

"NFC" | "NFD" | "NFKC" | "NFKD" |
"fully-normalized" | "none" | nmtoken

Verwendung

Optional

Einführung

XSLT 2.0

Mit Hilfe des Attributs normalisation-form kann eine bestimmte, für die Normalisierung des Ergebnisdokuments gewünschte Normalisierungsform angegeben werden. (Anmerkung: Das Attribut tritt an die Stelle des in früheren Working Drafts der Spezifikation vorgeschlagenen, weniger flexiblen Attributs normalize-unicode.) Es muss ein Nametoken aus der oben angegebenen Liste übergeben werden, oder ein NMTOKEN, das eine implementierte Normalisierungsform des Prozessors aktiviert. Der Defaultwert ist "none". Das Attribut darf in Zusammenhang mit allen Ausgabeformaten eingesetzt werden.

Wählbar sind vier verschiedene Formen der Unicode-Normalisierung, sowie die W3C-eigene Normalisierung FULLY-NORMALIZED. Auch prozessoreigene Normalisierungen sind wählbar – es ist jedoch nicht festgelegt, was geschieht, wenn das geforderte Format nicht unterstützt wird (die XPath-Funktion fn:normalize-unicode() meldet in vergleichbaren Fall einen Fehler).

Normalisierungsformen:
Der Standard verlangt von einer Applikation lediglich die Unterstützung der (meistverbreitetsten) Normalisierung nach NFC (Unicode Normalisation Form C, kanonische Komposition), die auch vom W3C favorisiert wird:

  • NFC – Unicode Normalisation Form C, kanonische Komposition

Neben NFC existieren weitere Vorschriften, deren Bezeichnungen der Applikation bekannt sein können (aber nicht müssen):

  • NFD – Unicode Normalisation Form D, kanonische Dekomposition
  • NFKC – Unicode Normalisation Form KC, kanonisch-kompatible Komposition
  • NFKD – Unicode Normalisation Form KD, kanonisch-kompatible Dekomposition

Nicht zum Unicode-Standard gehört eine weitere, möglicherweise durch Anwendungen unterstützte Form:

  • FULLY-NORMALIZED – die Normalisierungsvorschrift des W3C; beschrieben in »Character Model for the World Wide Web 1.0«.
    Diese Form entspricht im Wesentlichen NFC, erlaubt jedoch als erstes Zeichen des Strings nur so genannte Base Characters (Unicode Combining Class 0). Tritt am Stringanfang ein Kombinationszeichen auf, beispielsweise ein Akzentzeichen, wird diesem (zusätzlich, als Base Character) im Zuge der Normalisierung ein Leerzeichen vorangestellt, um das Kombinationszeichen zu tragen.

Sinnvoll normalisierbar ist jeder String, der zusammengesetzte Unicode-Zeichen (Kompositzeichen) enthält. Hierunter fallen beispielsweise Ligaturen, akzentierte Zeichen oder Umlaute – so kann z.B. der Kleinbuchstabe ä mittels des einzelnen Zeichens U+00E4 LATIN SMALL LETTER A WITH DIAERESIS oder als Kombination der beiden Zeichen U+0061 LATIN SMALL LETTER A und U+0308 COMBINING DIAERESIS dargestellt werden. Die möglichen Varianten können das Ergebnis eines direkten Stringvergleichs zweier (auch im Grunde als gleich zu betrachtenden) Zeichenketten quasi unvorhersehbar machen.

Im Rahmen der Normalisierung wird zunächst eine Dekomposition zusammengesetzter Zeichen vorgenommen, anschließend deren Ersetzung durch eine kanonische (einer gleichförmigen Regel entsprechenden) Kompositdarstellung. Treten Sonderzeichen als so genannte Singleton-Zeichen auf, die aus nur einem Unicode-Symbol bestehen (beispielsweise Å als Zeichen für »Ångstrom«), so werden sie durch ihre entsprechende kanonische Kompositform ersetzt.

Reiner ASCII-Text, und damit jeder Programm-Quellcode, bleibt bei einer erfolgenden Unicode-Normalisierung unverändert (ASCII enthält keine Kompositzeichen) – schädlich ist eine Normalisierung hier demzufolge also zwar nicht, sondern lediglich überflüssig.

Durch Unicode-Normalisierung betroffene Zeichen:
Vergleichstabellen aller von Unicode-Normalisierung betroffenen Zeichen aller Zeichensätze.

Hinweis: Das Attribut existiert nicht in XSLT 1.0.

omit-xml-declaration

Wert

"yes" | "no"

Verwendung

Optional

Einführung

XSLT 1.0

Das omit-xml-declaration-Attribut legt fest, ob die dem Ergebnisdokument durch den XSLT-Prozessor normalerweise hinzugefügte XML-Deklaration unterlassen werden soll. Das Attribut ist nur für method="xml" zulässig und wird für andere Ausgabeformate ("text" oder "html") ignoriert Der Defaultwert ist "no". Für "yes" unterbleibt die XML-Deklaration in jedem Fall.

Die XML-Deklaration kann zusätzlich eine standalone-Deklaration umfassen, falls das entsprechende Attribut gesetzt wird. In jedem Fall ist das version-Attribut und ein entsprechendes encoding-Attribut (in der Regel mit Wert "UTF-8", falls nicht im encoding-Attribut von xsl:output anders festgelegt) enthalten.

Hinweis: Das Attribut kann nicht dazu eingesetzt werden, um für reinen Textoutput method="text" eine XML-Deklaration in Form einer sogenannten »Textdeklaration« zu erzwingen. Für ein solches »XML-Fragment« muss das Ausgabeformat auf method="xml" gesetzt sein – siehe dazu Beispiel 3.

standalone

Wert

"yes" | "no" | "omit"

Verwendung

Optional

Einführung

XSLT 1.0

Das standalone-Attribut ist in Verbindung mit method="xml" zulässig. Es bestimmt, ob und mit welchem Wert der XML-Deklaration des Ergebnisdokuments ein standalone-Pseudoattribut hinzugefügt wird.

Für den Wert "yes" wird der XML-Deklaration das Pseudoattribut standalone="yes" beigefügt, analog bei "no" der Wert standalone="no". Lässt man das Attribut weg, oder setzt dessen Wert auf "omit" so erhält die XML-Deklaration des Ergebnisdokuments kein standalone-Pseudoattribut.

undeclare-prefixes

Wert

"yes" | "no"

Verwendung

Optional

Einführung

XSLT 2.0

Dieses Attribut wird für XML-Output verwendet, falls die auszugebende XML-Version neuer als 1.0 ist (also mindestens 1.1: Für Dokumente vom Typ XML 1.0 ist eine Namensraum-Undeklaration grundsätzlich nicht möglich).

Ab XML 1.1 kann die Tatsache, dass für ein Element weniger Namensräume im Scope sein sollen als für sein Parent-Element, bei der Serialisierung durch eine so genannte Namensraum-Undeklaration berücksichtigt werden. Dies geschieht durch Überschreiben des zu löschenden Namensraums durch einen Null-Namensraum (leerer Namensraum-URI) im entsprechenden Element. Das Attribut undeclare-prefixes wird hierfür auf den Wert "yes" gesetzt. Wird keine Undeklaration gewünscht, so wird der Wert "no" verwendet. Das Defaultverhalten ist anhängig von der jeweiligen Implementierung des Prozessors.

Hinweis: Das Attribut existiert nicht in XSLT 1.0.

use-character-maps

Wert

qnames

Verwendung

Optional

Einführung

XSLT 2.0

Das Attribut nennt in Form einer Tokenliste die QNames benannter xsl:character-map-Deklarationen, die in Verbindung mit der Output-Deklaration verwendet werden sollen. Ein Character-Mapping ermöglicht während der Serialisierung die Ersetzung eines beliebigen direkt verwendeten oder im Quelldokument oder Stylesheet durch ein Character Entity dargestellten Zeichens durch einen definierbaren Ausgabestring.

Innerhalb von benannten Charactermaps kann ein Zeichen jeweils einem String zugeordnet werden. So kann das Entity &#160; (geschütztes Leerzeichen) unmittelbar durch den String &amp;nbsp; ersetzt werden. Ebenfalls möglich ist so die Kontrolle des Zeilenumbruchs, indem der LF-Zeilenumbruchbefehl &#xA; für Windows-Umgebungen durch den String &#xD;&#xA; (Folge aus CR und LF) ersetzt wird.

Das Attribut ist in Verbindung mit allen Ausgabeformaten verwendbar. Wird es weggelassen, so findet kein Character-Mapping statt.

Es ist zu beachten, dass bei der Durchführung des Character-Mappings nicht geprüft wird, ob das Ergebnis gegen die Wohlgeformtheitsregeln verstößt, da die Strings literal »wie sie sind« eingesetzt werden.

Hinweis: Das Attribut existiert nicht in XSLT 1.0.

version

Wert

nmtoken

Verwendung

Optional

Einführung

XSLT 1.0

Das version-Attribut dient zusammen mit dem method-Attribut zur näheren Beschreibung des Versionsstandes des Ausgabeformats nach W3C-Richtlinien. Das Attribut kann nur in Verbindung mit den Aus­gabeformaten "xml", "html" und "xhtml" eingesetzt werden. Hierbei sollten ausschließlich gültige Versionsstände verwendet werden, so in Zusammenhang mit method="xml" derzeit version="1.0" oder version="1.1".

Defaultwert für method="xml" und method="xhtml" ist version="1.0", für method="html" ist es version="4.0". Sollen andere Versionsstände ausgege­ben werden, so muss das version-Attribut mit dem gewünschten Wert einge­setzt werden, ansonsten kann es unterbleiben. Für das Ausgabeformat "text" ist version nicht anwendbar und wird, falls es gesetzt ist, ignoriert.

Hinweis: Der Wert des version-Attributs kann für eine Output-Vorschrift aus xsl:result-document mittels des dortigen Attributs output-version überschrieben werden, falls erforderlich.

Verwendungszweck:

Die Anweisung xsl:output steuert das Ausgabe­format des Ergebnisdokuments einer XSLT-Transformation. Ist keine solche Deklaration vorhanden, so wird das Ergebnisdokument entsprechend der Defaultvorgaben ausgegeben, die sich durch sein Wurzelelement und dessen Namensraum ergeben. Lautet dessen lokaler Bezeichner nicht html, so ist das Ergebnisformat stets XML. XSLT 2.0 kann jedoch anhand des Namensraums eines Wurzelelements <html> zwischen HTML und XHTML unterscheiden.

Das Ausgabeformat muss nicht notwendigerweise wohlgeformtes XML sein. Dies ist definitiv nicht der Fall für die Ausgabeformate "html" und "text", ist aber auch für das Ausgabeformat "xml" nicht selbstverständlich: Hier besteht stets die Möglichkeit, ein »well-balanced« XML-Fragment zu erzeugen, das eine XML-Deklaration (ohne standalone-Attribut, also in Form einer Textdeklara­tion) besitzen darf und als »external general parsed entity« verwendet werden kann. Ein solches Dokument darf beispielsweise auch mit einem Textknoten begin­nen oder auf ein Wurzelelement verzichten.

Verhalten unter XSLT 1.0:
Es dürfen xsl:output-Deklarationen in beliebi­ger Anzahl auftreten, die aus beliebigen Quellen stammen können, also auch aus importierten oder inkludierten Stylesheetmodulen. Der XSLT-Prozessor verschmilzt alle die Deklarationen effektiv zu einer einzigen xsl:output-Deklaration.

Dopplungen von Attributwerten werden nach Importpräzedenz behandelt, wobei der Attributwert aus der Deklaration mit der höchsten Importpräzedenz den Vorrang bekommt. Bei Dopplungen von Werten mit gleicher Importpräze­denz hat der Prozessor die Wahl, entweder den zuletzt im Stylesheet stehenden Wert zu wählen oder einen Fehler zu melden (wobei es sich theoretisch auch um Dopplungen ein und desselben Wertes handeln kann!). Für die Gesamtde­klaration gilt als Attributwert von cdata-section-elements die Vereinigungs­menge aller in den Teildeklarationen genannten Elemente.

Verhalten unter XSLT 2.0:
In XSLT 2.0 können nach wie vor beliebig viele xsl:output-Deklarationen vorkommen, die auch per Inklusion oder Import aus externen Stylesheetmodulen stammen dürfen. Das Verhalten bei Dopplun­gen von Attributen und Werten entspricht grundsätzlich dem unter XSLT 1.0. Genau wie bei cdata-section-elements gilt für die Gesamtdeklaration auch beim Attribut use-character-maps die Menge aller genannten Characterm­aps.

Die wichtigste Neuerung ist die Unterscheidung zwischen einer unbenannten Default-Output-Deklaration und beliebig vielen, mittels des hinzugekomme­nen name-Attributs benannten Output-Deklarationen.

Diejenigen xsl:output-Deklarationen, die kein name-Attribut besitzen, wer­den unter Berücksichtigung ihrer Importpräzedenz zu einer einzigen unbe­nannten Output-Deklaration verschmolzen, die anstelle der Default-Output-Deklaration tritt.

Alle xsl:output-Deklarationen mit identischem name-Attribut werden, eben­falls wieder unter Berücksichtigung eventueller Importpräzedenzen, zu je einer benannten Output-Deklaration verschmolzen.

Für das unmittelbare Ergebnisdokument (initial result tree) des Stylesheets wird die unbenannte Output-Deklaration verwendet. Ist keine solche bzw. sind nur benannte Output-Deklarationen vorhanden, so treten in diesem Fall die Defaultwerte von xsl:output in Kraft.

Die benannten Output-Deklarationen werden in Zusammenhang mit der Erzeugung weiterer Ergebnisdokumente durch die Instruktion xsl:result-document benötigt. Die Referenz auf die Deklaration geschieht mittels des for­mat-Attributs von xsl:result-document, das den QName der gewünschten Output-Deklaration nennt. Existiert keine Output-Deklaration mit dem gefor­derten Namen, kann dies als statischer Fehler gewertet werden. In diesem Fall würde die Ausführung des Stylesheets gestoppt.

Wird eine xsl:result-document-Instruktion ohne format-Attribut verwen­det, so bezieht sie sich auf die unbenannte Output-Deklaration oder, falls keine solche vorhanden ist, auf die entsprechenden Defaultwerte.

Besonderheiten in Bezug auf die HTML-Ausgabe:

  • Keine Endmarken für leere HTML-Elemente:
    Leere HTML-Elemente bekommen keine Endmarke, auch nicht in der verkürzt geschriebenen Form, obwohl die Literal Result Elements mit dieser XML-Schreibweise im Stylesheet ste­hen müssen! Leere Elemente sind in HTML <area>, <base>, <basefont>, <br>, <col>, <frame>, <hr>, <img>, <input>, <isindex>, <link>, <meta> und <param>. Ein Zeilenumbruch, der im Style­sheet in der Form <br/> oder <br></br> stehen muss, wird daher als <br> ausgegeben.
  • Erkennung von Tag-Bezeichnern ist nicht »case«-abhängig:
    Die Ausga­bemethode soll HTML-Tag-Bezeichner in Literal Result Elements unabhängig von ihrer Schreibweise erkennen. Beispielsweise sollen alle folgenden Schreibweisen als Zeilenumbruchbefehl erkannt und als <br> (ohne Endtag) ausgegeben werden: <BR>, <Br>, <bR> usw.
  • Sonderzeichen in Text und Attributwerten, URL-Encoding:
    Im ausge­gebenen Text soll der XSLT-Prozessor diejenigen Zeichen, die nicht zum ASCII-Zeichensatz gehören, durch ihr entsprechendes HTML-Character Entity ersetzen. Die genaue Umsetzung kann von der gewählten HTML-Version abhängen.

    Dagegen soll der HTML-Output alle Instanzen von <, die in Attribut­inhalt des Ergebnisdokuments auftreten, nicht maskieren.

    In Attributen, die URIs enthalten (wie das src-Attribut von Frames oder Images oder alle href-Attribute), sollen Nicht-ASCII-Zeichen gemäß den Regeln zum URL-Encoding maskiert werden (siehe Section B.2.1 der HTML 4.0 Recommendation).

  • Kein Escaping von Inhalten des <script>- oder <style>-Containers:
    Inhalte von Containern, die JavaScript oder CSS-Anweisungen enthalten, sollen im Ergebnisdokument nicht escaped werden: Escaping würde dazu führen, dass bestimmte Operatoren wie < oder > für die Scriptinterpreter nicht mehr erkennbar wären. Stünde im Stylesheet (das Zeichen < muss dort außerhalb von CDATA-Bereichen escaped werden) dieses hier:

    <script> if (a &lt; b) tu-etwas() </script>

    oder, diesmal mit CDATA-Bereich (Anmerkung: In XHTML werden Inhalte von Scriptblöcken aus ähnlichem Grund ebenfalls in CDATA-Bereiche eingeschlossen.), Folgendes.

    <script><![CDATA[  if (a < b) tu-etwas()  ]]></script>,

    so sollte die Ausgabe in jedem Fall ohne Escaping erfolgen:

    <script>if (a < b) tu-etwas()</script>

  • Verkürzte (boolesche) Attribute:
    Die in HTML 4.0 erlaubten, verkürzten Attributschreibweisen (boolesche Attribute) sollen ebenso verkürzt ausgege­ben werden. Im Stylesheet selbst dürfen sie hingegen nicht verkürzt geschrie­ben werden (auch in XHTML sind sie in dieser Form nicht mehr gestattet!). Für folgendes Ele­ment im Stylesheet

    <input type="radio" selected="selected"/>

    soll ausgegeben werden:

    <input type="radio" selected>

  • Automatischer content-type-Meta-Tag:
    Der Encoding-Charset, den der Prozessor verwenden soll, wird über das encoding-Attribut des xsl:output-Elements bestimmt. Falls ein <head>-Element ausgegeben wird, so wird unmittelbar ein <meta>-Tag eingefügt, der den Content-Type nennt (ist kein Encoding festgelegt, so wird UTF-8 verwendet):

    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

    Der media-type kann zwar auch explizit gesetzt werden, liegt aber praktischerweise bereits defaultmäßig bei text/html, wie hier angedeutet.

    Tauchen Zeichen im Text auf, die nicht im Bereich des gewählten Content-Type-Encodings liegen, so werden diese vom XSLT-Prozessor automatisch durch entsprechende Unicode Character Entities ersetzt. Dies gilt jedoch nur für jene Dokumentteile, in denen ein Browser solche Entities auswerten könnte – daher ist ihr Einsatz innerhalb von <script> oder <style>-Containern nicht vorgesehen (siehe oben).

  • HTML-DOCTYPE-Deklaration:
    Falls das doctype-public- oder doctype-system-Attribut eingesetzt wird, soll dem Wurzelelement eine <!DOCTYPE html ...>-Deklaration mit PUBLIC oder SYSTEM-Identifier vor­angestellt werden. Als Identifier dienen die in den entsprechenden xsl:output-Attributen jeweils genannten Werte. Sind beide Attribute in Verwendung, so folgt der SYSTEM-Identifier, wie es bei XML üblich ist, dem PUBLIC-Identifier in der Deklaration.

Beispiele:

Beispiel 1 – Erzeugung eines HTML 4.0-Dokuments:

Quelldokument:

<?xml version="1.0"?>
<beispiel>Dies ist ein Beispieltext.<br/> Mehr Beispieltext.</beispiel>

Stylesheet:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" version="4.0"/>
  <xsl:template match="/">
    <html>
      <body>
       <xsl:copy-of select="."/>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Ergebnisdokument:

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Beispiel HTML</title>
  </head>
  <body>Dies ist ein Beispieltext.<br> Mehr Beispieltext</body>
</html>

Das Ergebnis entspricht dem HTML 4.0-Standard. Der aus dem Quelldokument kopierte leere Tag <br/> wird HTML-konform als <br> umgeschrieben.

Beispiel 2 – Erzeugung von XHTML mit XSLT 1.0:

Quelldokument:

<?xml version="1.0" encoding="ISO-8859-1"?>
<beispiel>Dies ist ein Beispieltext.<br/> Mehr Beispieltext.</beispiel>

Stylesheet:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/transitional">
  <xsl:output method="xml" encoding="ISO-8859-1" media-type="text/html" indent="yes" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/>
  <xsl:template match="/">
    <html>
      <head>
        <title>Beispiel HTML</title>
      </head>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="beispiel">
    <p><xsl:copy-of select="node()"/></p>
  </xsl:template>
</xsl:stylesheet>

Ergebnisdokument (Xalan):

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/TR/xhtml1/transitional">
  <head>
    <title>Beispiel HTML</title>
  </head>
  <body>
    <p>Dies ist ein Beispieltext.<br /> Mehr Beispieltext.</p>
  </body>
</html>

Das gewünschte XHTML-Ergebnis in wird in XSLT 1.0 über method="xml" erreicht. Der media-type ist auf "text/html" gesetzt. Beachten Sie die kompatible Ausgabe des leeren Tags <br /> mit Leerzeichen vor dem Slash.

Beispiel 3 – Erzeugung eines »general parsed entity« mit Textdeklaration:

Quelldokument:

<?xml version="1.0"?>
<beispiel>Dies ist ein Beispieltext.</beispiel>

Stylesheet:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="ISO-8859-1"/>
  <xsl:template match="/">
    <xsl:value-of select="."/>
  </xsl:template>
</xsl:stylesheet>

Ergebnisdokument:

<?xml version="1.0" encoding="ISO-8859-1"?>
Dies ist ein Beispieltext.

Nur auf dem Weg der XML-Ausgabeformatierung lässt sich die vorangestellte Textdeklaration für dieses XML-Fragment erzeugen.

Beispiel 4 – Erzeugung eines Plaintextdokuments:

Quelldokument:

<?xml version="1.0"?>
<beispiel>Dies ist ein Beispieltext.<br/> Mehr Beispieltext.</beispiel>

Stylesheet:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" media-type="text/plain"/>
  <xsl:template match="/">
    <plaintext>
      <doku>Ein einfacher Text:</doku>
      <xsl:apply-templates/>
    </plaintext>
  </xsl:template>
</xsl:stylesheet>

Ergebnisdokument:

Ein einfacher Text: Dies ist ein Beispieltext.
Mehr Beispieltext.

Wird method="text" als Ausgabeformat gewählt, so werden ausschließlich die Textkno­ten des Quelldokuments berücksichtigt. Auch aus dem Stylesheet werden Lite­ral Result Elements nicht kopiert, sondern nur deren Textinhalte. Dem Ergeb­nisdokument kann kein XML-Prolog vorangestellt werden. Will man eine Textdeklaration erzwingen, so muss gemäß Beispiel 3 vorgegangen werden.

Beispiel 5 – xsl:output und xsl:result-document

Folgendes Beispiel ist abgeleitet von einem entsprechenden Beispiel aus der XSLT 2.0-Spezifikation. Es wurde hier erweitert und kommentiert.

Quelldokument:

<?xml version="1.0" encoding="ISO-8859-1"?>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Roman in 100 Kapiteln</title>
  </head>
  <body>
    <h1>Erstes Kapitel</h1>
    <p>...</p>
    <h1>Zweites Kapitel</h1>
    <p>...</p>
    <p>...</p>
    <!-- mehr Kapitel -->
  </body>
</html>

Das Quelldokument ist ein umfangreiches XHTML-Dokument, das sich in eine Anzahl Kapitel untergliedert, die jeweils durch eine Überschrift <h1> eingelei­tet werden. Die Strukturen zwischen den Überschriften sind beliebig.

Stylesheet:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <!-- keine unbenannte Outputdeklaration -->
  <!-- benannte Outputdeklaration für das Inhaltsverzeichnisdokument: -->
  <xsl:output name="inhalt-format" method="xhtml" indent="yes" encoding="ISO-8859-1" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"/>
  <!-- benannte Outputdeklaration für die Kapiteldokumente: -->
  <xsl:output name="kapitel-format" method="xhtml" indent="no" encoding="ISO-8859-1" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/>
  <xsl:template match="/">
    <!-- Erzeugung des Inhaltsverzeichnisdokuments -->
    <xsl:result-document href="inhalt.html" format="inhalt-format" validation="strict">
      <html xmlns="http://www.w3.org/1999/xhtml">
        <head><title>Inhaltsverzeichnis</title></head>
        <body>
          <h1>Inhaltsverzeichnis</h1>
          <xsl:for-each select="/*/xhtml:body/(*[1] | xhtml:h1)">
            <p><a href="abschnitt{position()}.html"><xsl:value-of select="."/></a></p>
          </xsl:for-each>
        </body>
      </html>
    </xsl:result-document>
    <!-- Erzeugung der Kapiteldokumente: -->
    <xsl:for-each-group select="/*/xhtml:body/*" group-starting-with="xhtml:h1">
      <!-- Erzeugung eines Dokuments pro Kapitel: -->
      <xsl:result-document href="kapitel{position()}.html" format="kapitel-format" validation="strip">
        <html xmlns="http://www.w3.org/1999/xhtml">
          <head><xsl:value-of select="."/></head>
          <body>
            <!-- die gesamte Current Group wird kopiert: -->
            <xsl:copy-of select="current-group()"/>
          </body>
        </html>
      </xsl:result-document>
    </xsl:for-each-group>
  </xsl:template>
</xsl:stylesheet>

Erklärung des Beispiels:
Das vorliegende XSLT 2.0-Stylesheet besteht aus zwei benannten Out­put-Deklarationen und einer Template-Regel, aus der heraus mittels zwei xsl:result-document-Instruktionen die Ergebnisdokumente generiert wer­den. Die Template-Regel hat keinen initialen Output, sodass eine unbenannte Output-Deklaration nicht benötigt wird und auch deren Defaultwerte nicht zum Einsatz kommen.

Zunächst wird das Inhaltsverzeichnisdokument erzeugt, dem der URI "inhalt.html" zugewiesen wird. Das validation-Attribut mit Wert "strict" bedeutet in diesem Zusammenhang, dass das Ergebnisdokument einem, sich durch seinen Namensraum ergebenden Schema entsprechen muss. Innerhalb des Dokuments wird mittels einer xsl:for-each-Schleife ein Inhaltsverzeichnis generiert.

Anschließend wird der Inhalt des <body>-Tags des Quelldokuments mit xsl:for-each-group in einzelne Kapitel gruppiert, die jeweils durch eine Überschrift eingeleitet werden. Für jede der so erzeugten Gruppen wird ein Ergebnisdokument erzeugt, dessen URI sich aus der Position der Gruppe inner­halb der gebildeten Sequenz ergibt. Die Funktion current-group() wird zusammen mit xsl:copy verwendet, um die jeweilige Gruppe in den Body des Ergebnisdokuments zu kopieren. Das validation-Attribut der xsl:result-document-Instruktion besitzt hier den Wert "strip", das Ergeb­nisdokument wird nicht anhand eines Schemas geprüft, sondern alle Datentypen verworfen. Da "strip" der Defaultwert ist, könnte das Attribut hier auch unterbleiben.

Ergebnisdokumente:

<?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>Inhaltsverzeichnis</title>
  </head>
  <body>
    <h1>Inhaltsverzeichnis</h1>
    <p><a href="kapitel1.html">Erstes Kapitel</a></p>
    <p><a href="kapitel2.html">Zweites Kapitel</a></p>
    <!-- (Links zu weiteren Kapiteln) -->
  </body>
</html>

Code-Beispiel: inhalt.html.

Das Ergebnisdokument ist ein XHTML-Dokument vom Typ »strict«. Es besitzt einen XML-Prolog mit Doctype-Deklaration wie von der xsl:output-Deklara­tion gefordert. Das Dokument-Encoding entspricht dem encoding-Attribut der Output-Deklaration und spiegelt sich auch im Meta-Tag der Contenttyp-Beschreibung wider.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio¬nal.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Erstes Kapitel</title>
</head>
<body>
<h1>Erstes Kapitel</h1>
<p>...</p>
<!-- Rest des ersten Kapitels -->
</body>
</html>

Code-Beispiel: kapitel1.html (stellvertretend für die Kapiteldokumente).

Bei den einzelnen Kapiteldokumenten handelt es sich um XHTML-Dokumente vom Typ »transitional« mit entsprechendem XML-Prolog. Namensraum und Contenttyp-Beschreibung entsprechen denen des Inhaltsverzeichnisdoku­ments. Die zugrundeliegende Output-Deklaration besitzt allerdings ein indent-Attribut mit Wert "no", deshalb erfolgt keine Einrückung der Tags (hiermit ist auch der Möglichkeit vorgebeugt, dass sich im Quelldokument Ele­mente mit gemischtem Inhalt befinden könnten – für diese dürfte keine Einrü­ckung vorgenommen werden, da dies einer Veränderung ihres Inhalts gleich­käme).

Elementdefinition:

XSLT 1.0:

<!-- Category: top-level-element -->
<xsl:output 
  method = "xml" | "html" | "text" | qname-but-not-ncname 
  version = nmtoken 
  encoding = string 
  omit-xml-declaration = "yes" | "no"
  standalone = "yes" | "no"
  doctype-public = string 
  doctype-system = string 
  cdata-section-elements = qnames 
  indent = "yes" | "no"
  media-type = string 
/>

XSLT 2.0:

<!-- Category: declaration -->
<xsl:output
  name? = qname
  method?= "xml" | "html" | "xhtml" | "text" | qname-but-not-ncname
  byte-order-mark? = "yes" | "no"
  cdata-section-elements? = qnames
  doctype-public? = string
  doctype-system? = string
  encoding? = string
  escape-uri-attributes? = "yes" | "no"
  include-content-type? = "yes" | "no"
  indent? = "yes" | "no"
  media-type? = string
  normalization-form? = "NFC" | "NFD" | "NFKC" | "NFKD" | "fully-normalized" | "none" | nmtoken
  omit-xml-declaration? = "yes" | "no"
  standalone? = "yes" | "no" | "omit"
  undeclare-prefixes? = "yes" | "no"
  use-character-maps? = qnames
  version? = nmtoken 
/>

Hinweis: In XSLT 2.0 hinzugekommen sind die sieben Attribute name, byte-order-mark, escape-uri-attributes, include-content-type, normalization-form, undeclare-prefixes und use-character-maps. Der Wertebereich des method-Attributs wurde erweitert.

   

<< 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