XML | XML-Schema | XPath | XSL-T | XSL-FO | XQuery | XProc | SVG |
XSL-T / Die XSLT - Struktur / xsl:preserve-space, xsl:strip-space
![]() |
![]() |
➪ xsl:strip-space und xsl:preserve-space erlauben eine unterschiedliche Behandlung bestehender Whitespaces zwischen den Elementen des XML-Input-Dokuments.
Auf dieser Seite:Siehe
xsl:strip-space definiert jene Elemente, deren Whitespaces entfernt werden sollen. xsl:preserve-space definiert dagegen jene Elemente, deren Whitespaces beibehalten werden sollen. xsl:preserve-space ist die Default-Einstellung, daher macht seine Deklaration nur dann Sinn, wenn xsl:strip-space aktiviert ist und eine unterschiedliche Behandlung der Whitespaces angestrebt wird.
Nehmen Sie als Beispiel dieses XML-Dokument, das bewusst diverse Whitespaces aufweist.
<ZUTATEN>
<item>5 XML-Dateien</item>
<item
>1 XML-Schema</item>
<item>
3 XSL-Stylesheets
</item> <item>3 Schematron zum Testen</item>
<item>1 Party zum Feiern</item>
</ZUTATEN>
Die folgenden Templates arbeiten mit der unveränderten Behandlung der Whitespaces (das Element xsl:preserve-space elements="*" ist überflüssig, da Default) ...
<xsl:preserve-space elements="*"/>
<xsl:template match="ZUTATEN">
<p>
<b>ZUTATEN:</b>
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:template match="item">
<Zutat>
<xsl:apply-templates/>
</Zutat>
</xsl:template>
<xsl:template match="item[position() = last()]">
<zum_Schluss>
<xsl:apply-templates/>
</zum_Schluss>
</xsl:template>
<xsl:template match="text()">
<t>
<xsl:value-of select="."/>
</t>
</xsl:template>
... und zaubern ein Ergebnis auf den Monitor. Besonders an den Inhalten von <t> ... </t> erkennen Sie, wie der XSL-Prozessor die Whitespaces verarbeitet hat.
<p>
<b>ZUTATEN:</b>
<t>
</t>
<Zutat>
<t>5 XML-Dateien</t>
</Zutat>
<t>
</t>
<Zutat>
<t>1 XML-Schema</t>
</Zutat>
<t>
</t>
<Zutat>
<t>
3 XSL-Stylesheets
</t>
</Zutat>
<t> </t>
<Zutat>
<t>3 Schematron zum Testen</t>
</Zutat>
<t>
</t>
<zum_Schluss>
<t>1 Party zum Feiern</t>
</zum_Schluss>
<t>
</t></p>
Ganz anders sieht das Result mit xsl:strip-space aus:
<xsl:strip-space elements="*"/>
Hier tauchen die Textelemente <t> ... </t> der Whitespaces erst gar nicht auf.
<?xml version="1.0" encoding="UTF-8"?>
<p>
<b>ZUTATEN:</b>
<Zutat>
<t>5 XML-Dateien</t>
</Zutat>
<Zutat>
<t>1 XML-Schema</t>
</Zutat>
<Zutat>
<t>
3 XSL-Stylesheets
</t>
</Zutat>
<Zutat>
<t>3 Schematron zum Testen</t>
</Zutat>
<zum_Schluss>
<t>1 Party zum Feiern</t>
</zum_Schluss>
</p>
Vergessen Sie nicht, dass Sie mit xsl:output und dessen indent-Attribut die Ausgabe steuern können: Hier werden entweder Whitespaces in den Output geschrieben (indent="yes") oder nicht (indent="no").
<xsl:output method="xml" indent="yes" />
Wenn ein Element führende oder schließende Spaces beinhaltet, wird das auch mit ausgegeben. Hier können Sie mit normalize-space eingreifen. Ein Beispiel:
<xsl:template match="text()">
<xsl:value-of select="normalize-space(.)"/>
</xsl:template>
Auch in Attributen können strip-spaces behandelt werden. Hier bietet die XPath-Funktion translate gute Unterstützung.
<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="translate(., ' ', '')" />
</xsl:attribute>
</xsl:template>
wg / 31. Oktober 2020
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de