xsl:text

(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 Instruktion xsl:text erzeugt einen Textknoten im Ergebnisbaum. Innerhalb der Instruktion findet keine Normalisierung statt, sodass auch Text, der vollständig aus Whitespace-Zeichen besteht, unverändert ins Ergebnisdokument kopiert wird.

Klassifizierung Instruktion
Funktionsgruppe Output im Ergebnisdokument erzeugen
Einführung XSLT 1.0

Position im Stylesheet und erlaubte Inhalte:

Die Instruktion xsl:text darf überall innerhalb von Sequenzkonstruktoren vorkommen. Im Inneren der Instruktion sind ausschließlich Textnodes erlaubt, keine Elemente oder XSLT-Instruktionen. Alternativ darf die Instruktion leer sein, erzeugt dann jedoch keinen Output.

Attribute:

Es gelten die Standardattribute. Daneben besitzt die Instruktion lediglich ein elementspezifisches optionales Attribut disable-output-escaping, von dessen Verwendung in XSLT 2.0 abgeraten wird.

disable-output-escaping

Wert

"yes" | "no"

Verwendung

optional

Einführung

XSLT 1.0

Deprecated in XSLT 2.0. Mittels des disable-output-escaping-Attributs kann das reguläre Verhalten des Parsers, bestimmte Zeichen bei der Serialisierung des Textknotens zu escapen, unterdrückt werden.

Hierfür muss der Wert des Attributs auf disable-output-escaping="yes" gesetzt werden. Der andere erlaubte Wert, gleichzeitig Defaultwert bei Abwesenheit des Attributs, ist "no". Das Attribut ist prinzipiell einsetzbar in Zusammenhang mit den Output-Formaten "xml", "xhtml" und "html"; seine Verwendung in XSLT 2.0 ist allerdings misbilligt.

Verwendungszweck:

Die Instruktion xsl:text erzeugt im Ergebnis­baum einen Textknoten, dessen Inhalt dem Stringwert des Inhalts der Instruk­tion entspricht. Der Inhalt wird nicht normalisiert, Sonderzeichen werden jedoch maskiert (escaped), sofern erforderlich. Ist die Instruktion leer, so gibt sie die leere Sequenz zurück, erzeugt also keinen Output in den Ergebnisbaum.

Die Instruktion stellt nicht die einzige Methode dar, um Textknoten dem Ergebnisdokument hinzuzufügen. Soll sich der Text aus der Auswertung eines XPath-Ausdrucks ergeben, so ist xsl:value-of meist die bessere Lösung. Liegt der Text als Literal vor, so ist es der einfachste Weg, diese Literale in den Sequenzkonstruktor einer Template-Regel einzufügen. Alternativ kann ein Text­literal in eine xsl:text-Instruktion eingeschlossen werden, wenn mehr Kon­trolle über die Ausgabe gewünscht ist.

Die Instruktion ist in zwei Fällen erforderlich:

  • Es soll ein Textknoten erzeugt werden, der nur aus Weißraumzeichen besteht (Leerzeichen, Tabulator, Zeilenumbruch, Wagenrücklauf).
  • Es soll ein Textknoten erzeugt werden, dessen Inhalt nicht escaped werden darf (dies ist ebenfalls mit xsl:value-of möglich).

Knoten aus Weißraumzeichen erzwingen:
Der XSLT-Prozessor betrachtet Textknoten aus Whitespace-Zeichen innerhalb von Template-Regeln, wie sie in Form von Zeilenumbrüchen und Leerzeichen bzw. Tabulatoren zwischen Ele­mentcontainern auftreten, nicht als signifikante Textliterale und kopiert sie ent­sprechend nicht in das Ergebnisdokument:

<!-- Leerzeichen zwischen Vor- und Nachname wird entfernt: -->
<name>
  <xsl:value-of select="vorname"/> <xsl:value-of select="nachname"/>
</name>

Ein mögliches Ergebnis wäre z.B.:

<name>PeterMüller</name>

Soll ein entsprechender Weißraum-Textknoten in jedem Fall kopiert werden, so kann er in eine xsl:text-Instruktion eingeschlossen werden:

<!-- Leerzeichen wird geschützt: -->
<name>
  <xsl:value-of select="vorname"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="nachname"/>
</name>

Das Ergebnis ist in diesem Fall das erwünschte:

<name>Peter Müller</name>

Eine alternative Lösung ist mit der Stringfunktion fn:concat() möglich:

<name><xsl:value-of select="fn:concat(vorname,'  ',nachname)"/></name>

Unterdrückung des Output-Escapings für Format »xml«:
Das normale Verhalten des Parsers besteht darin, die in XML durch vordefi­nierte Entities darzustellenden Zeichen im Ergebnisdokument ebenfalls durch ein entsprechendes Entity zu ersetzen. Hiermit soll gewährleistet sein, dass das Ergebnis einer XSLT-Transformation auch wohlgeformtes XML ist. Betroffen sind für das Ergebnisformat "xml" die Zeichen <, >, &, », und '. Andere Zeichen werden nicht ersetzt.

Manchmal ist eine solche Ersetzung jedoch nicht erwünscht. Will man, warum auch immer, z.B. den String »C&A« literal ins Ergebnisdokument schreiben las­sen, so stößt man an dieser Stelle bereits auf Schwierigkeiten.

Zunächst einmal ist es nicht möglich, das Zeichen & als Literal im XSLT-Styles­heet einzufügen – es muss zwangsläufig durch das Entity &amp; ausgedrückt werden. Wird dies versucht

<xsl:text>C&amp;A</xsl:text>

so erhält man anstelle des gewünschten »C&A« aufgrund des automatischen Escapings auch im Ergebnisdokument den String »C&amp;A«.

Um das gewünschte literale Zeichen zu erhalten, kann man das Output-Esca­ping unterdrücken – hierzu dient das Attribut disable-output-escaping:

<xsl:text disable-output-escaping="yes">C&amp;A</xsl:text>

Dieser Umweg führt zum gewünschten Ergebnis »C&A« – dieser String könnte jedoch nicht Teil eines wohlgeformten XML-Dokuments sein.

Technisch betrachtet, wird, sobald das Attribut mit Wert "yes" gesetzt ist, jedes Zeichen des erzeugten Textknotens im Ergebnisbaum mit einem booleschen Flag disable-escaping gekennzeichnet. Dies führt zur Unterdrückung des normalen Escaping-Verhaltens für die entsprechenden Zeichen.

Unterdrückung des Output-Escapings für Format "html" und "xhtml":
In Abhängigkeit vom gewählten Output-Format erstreckt sich Escaping bzw. die Möglichkeit seiner Unterdrückung auch auf weitere Zeichen. So werden für das Ausgabeformat "html" und "xhtml" beispielsweise auch Umlaute durch HTML-Entities wiedergegeben – so beispielsweise das Zeichen »Ä«, auch wenn es im XSLT-Stylesheet durch das Character Entity &#xC4; vertreten ist, durch das HTML-Entity &Auml;.

Soll nun statt des Entitys ein »Ä« literal ausgegeben werden, kann dies forciert werden, indem auch in diesem Fall disable-output-escaping eingesetzt wird. Es ist allerdings notwendig, darauf zu achten, für das Ergebnisdokument das geeignete Encoding zu wählen (hier z.B. ISO-8859-1), um keine unliebsa­men Überraschungen zu erleben.

disable-output-escaping und Format "text":
In Zusammenhang mit dem Ergebnisformat "text" werden nur die Textknoten des Ergebnisbaums seriali­siert. Alle Zeichen, auch wenn sie im XSLT-Stylesheet durch Entities (auch Cha­racter Entities) vertreten sind, werden dabei in ihrer literalen Form ausgege­ben.

Da also grundsätzlich in Verbindung mit diesem Ausgabeformat kein Escaping im Ergebnisdokument stattfindet, ist das Setzen des disable-output-esca­ping-Attributs in diesem Zusammenhang irrelevant (allerdings auch nicht schädlich).

Beispiele:

Beispiel 1 – Zeilenumbruch in xsl:text:

Mittels der xsl:text-Instruktion kann ein Whitespace-Textknoten in das Ergebnisdokument kopiert werden. Alternativ kann dieser allerdings auch in einer globalen Variable abgelegt und zur Formatierung des serialisierten Quelltextes verwendet werden. Hier ein Beispiel mit einem Zeilenumbruch:

<xsl:variable name="umbruch"><xsl:text>
</xsl:text></xsl:variable>

Dieser Zeilenumbruch ist nun unter $umbruch überall im Stylesheet verfügbar und kann bei Bedarf ausgegeben werden:

<xsl:value-of select="'Ein'"/>
<xsl:value-of select="$break"/>
<xsl:value-of select="'Beispiel'"/>

ergibt im Quelltext des Ergebnisdokuments:

Ein
Beispiel

Ohne den zusätzlich erzwungenen Umbruch würden beide von xsl:value-of erzeugten Textknoten aneinander gehängt ausgegeben werden. (Anmerkung: Hier werden der Einfachheit halber statt »richtiger« XPath-Ausdrücke einfache Stringlite­rale verwendet. Im Grunde stellt dieses Beispiel eine Variation des oben angeführten Vorname-Nachname-Beispiels dar.)

Beispiel 2 – Erzeugen einer ASP-Anweisung mit xsl:text:

Soll ein Ergebnisdokument Abschnitte enthalten, die aus XML-Sicht nicht wohlgeformt sind, beispielsweise PHP- oder wie in diesem Beispiel ASP-Anwei­sungen, so können diese durch xsl:text-Instruktionen mit deaktiviertem Out­put-Escaping realisiert werden:

<xsl:text disable-output-escaping="yes">&lt;%@ Language="VBScript" %&gt;</xsl:text>

Das Ergebnis ist wie gewünscht:

<%@ Language="VBScript" %>

Ohne das Escaping zu deaktivieren, erhielte man jedoch

&lt;%@ Language="VBScript" %&gt;

was wohl, wie zu erwarten steht, nicht funktionieren würde.

Elementdefinition:

XSLT 1.0:

<!-- Category: instruction -->
<xsl:text 
  disable-output-escaping = "yes" | "no" >

  <!-- Content: #PCDATA -->
</xsl:text>

XSLT 2.0:

<!-- Category: instruction -->
<xsl:text
  [ disable-output-escaping ]? = "yes" | "no" >

  <!-- Content: #PCDATA -->
</xsl:text>

Hinweis: In XSLT 2.0 gilt das Attribut disable-output-escaping als »deprecated« und ist hier deshalb in eckige Klammern gesetzt.

Querverweise:

Knotenkonstruktoren für die restlichen Knotentypen existieren in Form von xsl:attribute, xsl:comment, xsl:element, xsl:processing-instruction und (seit XSLT 2.0) als xsl:namespace.

   

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