Home
Über mich
Veröffentlichungen

XML XML-Schema XPath XSL-T XSL-FO XQuery XProc SVG

XSL-T / Die XSLT - Struktur / xsl:preserve-space, xsl:strip-space

xsl:preserve-space, xsl:strip-space

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

Alternative: normalize-space

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>

strip-spaces in Attributen

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.






Vielen Dank für Ihr Interesse an meiner Arbeit.



V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/xsl_preserve_space.html