Unterschied zwischen den XSL-Elementen copy-of und value-of

Dieser Artikel beschreibt die Unterschiede beim Einsatz der XSL-Elemente copy-of und value-of und geht dabei auch auf das WSL-Tag unescapeCDATA ein.

Um Inhalte eines XML-Dokumentes über die XSLT-Transformation in das Ausgabedokument zu bekommen, gibt es unter anderem folgende XSL-Elemente:

  • xsl:copy-of
    Kopiert einen aktuellen Knoten und das gesamte davon abhängige Knoten-Set in den Ergebnisbaum an die Stelle, an der die Anweisung notiert ist. Das ist beispielsweise sinnvoll, um den Inhalt eines Elements, das nur einmal in den Daten notiert ist, an mehreren Stellen zu wiederholen.
    (Quelle: SELFHTML)
  • xsl:value-of
    Erzeugt eine gespeicherte Zeichenkette an der aktuellen Position im Ausgabebaum. Bei der gespeicherten Zeichenkette kann es sich z.B. um den Inhalt eines Knotens der XML-Daten handeln, oder um den Inhalt einer zuvor definierten Variablen.
    (Quelle: SELFHTML)

Diese XSL-Elemente werden z.B. in der SELFHTML-Dokumentation (siehe weiterführende Links) oder anderen Dokumentationen (W3C, etc.) genauer beschrieben. Die vorige Liste stellt einen Auszug aus der Dokumentation des SELFHTML-Projektes dar (kursive Textpassage).

Unterschiede copy-of und value-of

Die nachfolgenden Beispiele demonstrieren die Unterschiede beim Einsatz der entsprechenden XSL-Elemente und der verwendeten Attribute.

Beispiel: Auszug aus einem XML-Dokument zum wd:fragment Text (mit nicht korrekt gesetztem &-Zeichen)

...
<wd:fragment id="text" type="text.standard"><![CDATA[<p>Anwendungsbeispiel zu copy-of & value-of!</p>]]></wd:fragment>
...

Dieses Fragment wird nun über unterschiedliche XSL-Aufrufe ausgelesen, was die Unterschiede der verwendeten XSL-Elemente demonstriert.

Beispiel: Auszug aus dem XSL-Template zum Einsatz mit copy-of

...
<xsl:copy-of select="wd:fragment[@id = 'text']/text()|wd:fragment[@id = 'text']/*"/>
...

<!--
Erzeugt folgenden vom Browser interpretierten Quelltext:

&lt;p&gt;Anwendungsbeispiel zu copy-of &amp; value-of!&lt;/p&gt;

Das &-Zeichen wird zwar XHTML-Konform ausgegeben, allerdings werden die HTML-Tags als solche in der Webseite angezeigt (<p>...</p>).

-->

Beispiel: Auszug aus dem XSL-Template zum Einsatz mit copy-of und wsl:unescapeCDATA

...
<wsl:unescapeCDATA><xsl:copy-of select="wd:fragment[@id = 'text']/text()|wd:fragment[@id = 'text']/*"/></wsl:unescapeCDATA>
...

<!--
Erzeugt folgenden vom Browser interpretierten Quelltext:

<p>Anwendungsbeispiel zu copy-of & value-of!</p>

Das &-Zeichen wird nicht XHTML-Konform ausgegeben, weshalb die Seite nicht valide ist. Die HTML-Tags werden korrekt umgesetzt und interpretiert.

-->

Beispiel: Auszug aus dem XSL-Template zum Einsatz mit value-of

...
<xsl:value-of select="wd:fragment[@id = 'text']"/>
...


<!--
Erzeugt folgenden vom Browser interpretierten Quelltext:

&lt;p&gt;Anwendungsbeispiel zu copy-of &amp; value-of!&lt;/p&gt;

-->

Beispiel: Auszug aus dem XSL-Template zum Einsatz mit value-of und wsl:unescapeCDATA

...
<wsl:unescapeCDATA><xsl:value-of disable-output-escaping="yes" select="wd:fragment[@id = 'text']"/></wsl:unescapeCDATA>
...


<!--
Erzeugt folgenden vom Browser interpretierten Quelltext:

<p>Anwendungsbeispiel zu copy-of & value-of!</p>

Das &-Zeichen wird nicht XHTML-Konform ausgegeben, weshalb die Seite nicht valide ist. Die HTML-Tags werden korrekt umgesetzt und interpretiert.

-->

Beispiel: Auszug aus dem XSL-Template zum Einsatz mit value-of mit disable-output-escaping

...
<xsl:value-of disable-output-escaping="yes" select="wd:fragment[@id = 'text']"/>
...


<!--
Erzeugt beim Aufruf über den Browser einen Fehler:

Warning: DOMDocument::loadXML() [domdocument.loadxml]: xmlParseEntityRef: no name in Entity, ...

-->

Fazit

Zeichen innerhalb von Textfeldern sollten immer korrekt und somit XHTML-Konform gesetzt werden, damit diese über xsl:value-of valide ausgegeben werden können.