xsl:value-of

(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:value-of kopiert den Stringwert des XPath-Ausdruckes seines select-Attributes als Textknoten in die Ergebnissequenz. Ist kein select-Attribut vorhanden, so wird (nur in XSLT 2.0 möglich!) alternativ der Stringwert eines optionalen Sequenzkonstruktors verwendet.

Klassifizierung Instruktion
Funktionsgruppe Stringwerte ins Ergebnisdokument kopieren
Einführung XSLT 1.0

Position im Stylesheet und erlaubte Inhalte:

Die Instruktion xsl:value-of kann überall in Sequenzkonstruktoreneingesetzt werden, wo Textknoten generiert werden sollen.

In XSLT 2.0 darf xsl:value-of einen Sequenzkonstruktor enthalten, sofern ihr select-Attribut nicht eingesetzt wurde – ansonsten muss die Instruktion leer sein. In XSLT 1.0 ist die Instruktion stets leer.

Attribute:

Es gelten die Standardattribute. Zusätzlich besitzt xsl:value-of drei optionale Attribute in Form von select (in XSLT 1.0 noch obligatorisch), disable-output-escaping (in XSLT 2.0 »deprecated«) und separator (neu in XSLT 2.0).

disable-output-escaping

Wert

"yes" | "no"

Verwendung

optional

Einführung

XSLT 2.0

Deprecated in XSLT 2.0. Mittels des disable-output-escaping-Attributs kann das normale 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.

select

Wert

xpath-expression

Verwendung

optional (in XSLT 1.0 obligatorisch).

Einführung

XSLT 2.0

Ein XPath-Ausdruck, der eine Sequenz aus Nodes und/oder atomaren Werten bestimmt, deren Items im Bedarfsfall atomisiert werden. Besteht die Sequenz aus einem oder mehreren Items, so werden die Stringwerte aller Items durch Leerzeichen getrennt verkettet, sofern nicht ein separator-Attribut gesetzt ist. Ist die Sequenz leer, so wird die leere Sequenz zurückgegeben. Im rückwärtskompatiblen Modus (entsprechend XSLT 1.0) wird nur der Stringwert des ersten Items berücksichtigt.

Ist kein select-Attribut vorhanden, so darf die Instruktion (in XSLT 2.0) einen Sequenzkonstruktor enthalten, dessen Stringwert verwendet wird. Fehlt beides, so gibt die Instruktion die leere Sequenz zurück. Ist ein select-Attribut vorhanden, aber die Instruktion nicht gleichzeitig leer, so wird ein statischer Fehler gemeldet.

separator

Wert

{string} (auch als AVT)

Verwendung

optional

Einführung

XSLT 2.0

Der Attributwert ist ein String xs:string; die als Separator zu verwendende Zeichenkette. Wenn das separator-Attribut gesetzt wird, gibt die Instruktion einen Textknoten zurück, der aus den verketteten Stringwerten aller in der Eingabesequenz enthaltenen Items besteht (bzw. die sich aus dem enthaltenen Sequenzkonstruktor ergeben), zwischen die jeweils der als Separator definierte String eingeschoben ist. Ist die Eingangssequenz leer, so gibt die Instruktion unabhängig vom Wert des Separatorstrings die leere Sequenz zurück.

Ist ein Item der Sequenz nicht atomar (z.B. ein Elementknoten), so wird des­sen Wert im Vorfeld atomisiert. Wird als Separator der leere String verwendet, so werden die Stringwerte der Items unmittelbar verkettet.

Defaultverhalten:
Ist das separator-Attribut nicht gesetzt, so existieren drei verschiedene Möglichkeiten, wie sich die Instruktion verhält, je nachdem, ob sie mit rückwärtskompatiblem Verhalten mit select-Attribut ausgeführt wird, im Normalmodus mit select-Attribut oder im Normalmodus mit Sequenzkonstruktor.

  • Rückwärtskompatibles Verhalten:
    Es wird nur der Stringwert des ers­ten Items der durch select erzeugten Sequenz zurückgegeben (die restlichen Items werden verworfen). Dies entspricht dem grundsätzlichen Verhalten unter XSLT 1.0, wo kein separator-Attribut existiert: Auch hier wird von einem übergebenen Nodeset nur der Stringwert des ersten Knotens ausgegeben.
  • Normalmodus mit select-Attribut:
    Die Instruktion wird ausgewertet, als ob ein separator-Attribut mit einem Leerzeichen (#x20) als Attributwert vorhanden wäre. Die Stringwerte aller Items der durch select gebildeten Sequenz werden in diesem Fall als leerzeichengetrennte Liste ausgeben.
  • Normalmodus mit Sequenzkonstruktor:
    Die Instruktion wird ausge­wertet, als ob ein separator-Attribut mit einem leeren String als Attribut­wert vorhanden wäre. Die Stringwerte aller Items der durch den Sequenz­konstruktor gebildeten Sequenz werden in diesem Fall unmittelbar verket­tet.

Verwendungszweck:

Die Instruktion xsl:value-of erzeugt einen Text­knoten im Ergebnisbaum, der auf Grundlage der Auswertung des XPath-Aus­drucks im select-Attribut der Instruktion berechnet wird. Der Eingangswert der Instruktion kann auf diesem Weg eine beliebige Sequenz aus Knoten oder atomaren Werten sein (in Folge als »Eingabesequenz« bezeichnet). Ergibt die Auswertung des Ausdrucks eine leere Sequenz, so gibt die Instruktion die leere Sequenz zurück und erzeugt entsprechend keinen Output im Ergebnisdoku­ment.

Ist ein Item der Eingabesequenz nicht atomar, so wird es atomisiert. Ein Ele­mentknoten wird entsprechend seines Stringwerts in einen Textknoten umge­wandelt.

Standardverhalten differiert zwischen XPath 1.0 und XPath 2.0:
Besteht die so erhaltene atomisierte Eingangssequenz aus mehreren Items, so hängt das Ver­halten der Instruktion davon ab, ob sie im normalen oder im rückwärtskompa­tiblen Verhalten ausgeführt wird. Ist Letzteres der Fall, so besteht der erzeugte Textknoten lediglich aus dem Stringwert des ersten Items der Sequenz (in XSLT 1.0/XPath 1.0 ist dies, wie bereits gesagt, Standardverhalten). Ent­sprechendes Verhalten kann für einen XSLT 2.0-kompatiblen Prozessor erzwungen werden, indem der Instruktion ein version-Attribut mit Wert "1.0" beigegeben wird.

Besitzt die Instruktion dagegen ein version-Attribut mit dem Wert "2.0" oder größer, so bleibt das rückwärtskompatible Verhalten des XSLT 2.0-Prozessors in jedem Fall deaktiviert. Hierfür genügt es auch, wenn ein version-Attribut bei xsl:value-of selbst nicht explizit gesetzt, aber mit entsprechendem Wert bei einem Element der Ancestor-Achse (z.B. im Stylesheetelement xsl:styles­heet) vorhanden ist, und nicht durch ein version-Attributs einer Instruktion einer dazwischen liegenden Hierarchieebene überschrieben wurde.

In diesem Standardverhalten für XSLT 2.0 werden stets die Stringwerte aller (dafür atomisierten) Items der Eingabesequenz durch ein Leerzeichen getrennt im erzeugten Textknoten ausgegeben. Ist ein separator-Attribut vorhanden, so wird anstelle des Leerzeichens der von diesem vorgegebene Trennstring zur Verkettung verwendet.

Beispiele:

Beispiel 1a – Extraktion der Stringwerte von Child-Elementen:

XML-Dokument (Auszug):

...
<name>
  <vorname>Peter</vorname>
  <nachname>Meier</nachname>
</name>
...

Stylesheet (Auszug):

<xsl:template match="name">
  <p>
    <xsl:value-of select="vorname"/>
    <xsl:text> </xsl:text>
    <xsl:value-of select="nachname"/>
  </p>
</xsl:template>

ergibt (Auszug):

...
<p>Peter Meier</p>
...

In der aktuellen Template-Regel ist ein Element <name> aktueller Knoten, das zwei Child-Elemente <vorname> und <nachname> enthält. Mittels der Instruk­tion xsl:value-of werden die Stringwerte beider Elemente extrahiert und ausgegeben (die xsl:text-Instruktion erzwingt das Leerzeichen zwischen Vor- und Nachname).

Hierbei ist zu beachten, dass der zurückgegebene Stringwert aus allen verket­teten Textknoten auf der Descendant-Achse des verarbeiteten Knotens besteht. Leicht übersieht man, dass hierzu auch die Whitespace-Nodes zwischen Ele­menten gehören, die in Form von Tabulatoren und/oder Zeilenumbrüchen ins Ergebnisdokument gelangen können.

Beispiel 1b – Extraktion der Stringwerte von Child-Elementen:

Würde das Stylesheet bei gleichem Quelldokument folgendermaßen lauten

<xsl:template match="name">
  <p>
    <xsl:value-of select="."/>
  </p>
</xsl:template>

so ist das Ergebnis (unerwarteterweise?)

<p>
   Peter
   Meier
</p>

Für die Ausgabe als HTML, wie in diesem Fall, mag dies zu tolerieren sein. Es gelangt allerdings abhängig von der Formatierung des Quelldokuments belie­big viel überflüssiger Leerraum ins Ergebnisdokument, sodass eine kontrollier­tere Wertextraktion (oder eine Normalisierung vor der Ausgabe) wünschens­wert erscheint. Eine mögliche Lösung wäre daher auch:

<xsl:value-of select="fn:normalize-space(.)"/>

Beispiel 2a – select-Eingangssequenz ohne separator-Attribut:

<p>
  <xsl:value-of select="(1,2,3,4,'Hallo','Welt!')"/>
</p>

ergibt:

<p>1 2 3 4 Hallo Welt!</p>

Hier werden die vier Items einer literalen Eingabesequenz mit jeweils einge­schobenen Leerzeichen verkettet ausgegeben, also mit dem Default-Separator­string ' '.

Beispiel 2b – select-Eingangssequenz mit separator-Attribut:

<p>
  <xsl:value-of select="(1,2,3,4,'Hallo','Welt!')" separator=" + "/>
</p>

ergibt:

<p>1 + 2 + 3 + 4 + Hallo + Welt!</p>

Hier werden die vier Items einer literalen Eingabesequenz mit jeweils dazwi­schen eingeschobenem Separatorstring ' + ' verkettet ausgegeben.

Beispiel 3a – Mit enthaltenem Sequenzkonstruktor:

<p>
  <xsl:value-of>
    <xsl:sequence select="(1, 2, 3, 4)"/>
    <foo>Hallo</foo>
    <bar>Welt!</bar>
  </xsl:value-of>
</p>

ergibt:

<p>1234HalloWelt!</p>

Unabhängig davon, ob der Sequenzkonstruktor Literal Result Elements, XSLT-Instruktionen oder eine Mischung aus beidem enthält, werden die Items der so erzeugten Sequenz atomisiert und ihre Stringwerte miteinander verkettet. Die Instruktion xsl:value-of verhält sich so, als ob ein separator-Attribut mit separator="" gesetzt wäre. In der Sequenz enthaltene Whitespace-Textnodes fallen weg (ihr Stringwert ist der leere String).

Beispiel 3b – Mit enthaltenem Sequenzkonstruktor und separator-Attribut:

<p>
  <xsl:value-of separator=" ">
    <xsl:sequence select="(1, 2, 3, 4)"/>
    <foo>Hallo</foo>
    <bar>Welt!</bar>
  </xsl:value-of>
</p>

ergibt:

<p>1 2 3 4 Hallo Welt!</p>

Das separator-Attribut muss explizit mit Leerzeichen als Argument eingesetzt werden, sollen die Stringwerte des Items des Sequenzkonstruktors nicht unmittelbar verkettet werden. In der Sequenz enthaltene Whitespace-Textno­des fallen dabei nach wie vor weg.

Elementdefinition:

XSLT 1.0:

<!-- Category: instruction -->
<xsl:value-of 
     select = string-expression 
     disable-output-escaping = "yes" | "no" 
/>

XSLT 2.0:

<!-- Category: instruction -->
<xsl:value-of
     select? = expression
     separator? = { string }
     [ disable-output-escaping ]? = "yes" | "no" >

     <!-- Content: sequence-constructor? -->
<xsl:value-of/>

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

   

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