XML | XML-Schema | XPath | XSL-T | XSL-FO | XQuery | XProc | SVG |
XSL-T / XSLT-Tipps / XSLT 2.0: Erweiterte Syntax
![]() |
![]() |
➪ Ab XSLT 2.0 haben Sie die Möglichkeit, komplexe Logiken (Schleifen, Bedingungen) mit einer erweiterten Syntax zusammenzufassen. Das hat auch Auswirkungen auf eine eventuelle Migration von XSL 1.0 auf XSL 2.0 bzw. XSL 3.0.
Auf dieser Seite:Siehe XSLT 2.0 und XSLT 3.0.
Auch hier können zum besseren Verständnis der Programmlogik lokale Kommentare sinnvoll sein. Diese lokalen Kommentare sind in der Syntax "(: Kommentar :)" abgefasst.
<erg>
<xsl:value-of
select="if (8 > 5)
then ('8 groesser als 5')
else ()
(:lokaler Kommentar, wird nicht ausgegeben:)" />
</erg>
Die Ausgabe im Ergebnisdokument lautet:
<erg>8 groesser als 5</erg>
Sinnvoll können solche Kommentare bei komplexen Schleifen mit Fallunterscheidung werden:
<erg>
<xsl:for-each select="for $m in //Mensch
(: Schleife ueber alle Mensch-Nodes :)
return if (matches($m/name, '[S][a-z]*'))
then ($m/name)
(:filtere alle heraus, deren name mit S beginnt:)
else ()
(:sonst keine Rueckgabe:)">
<name>
<xsl:value-of select="."/>
</name>
</xsl:for-each>
</erg>
Auch hier erscheint im Output kein Kommentar:
<erg>
<name>Sprachlos</name>
<name>Sagblos</name>
<name>Sorglos</name>
<name>Sinnlos</name>
<name>Schlaflos</name>
</erg>
Ebenfalls sehr vorteilhaft ist die Kontrolle über das Type-Casting, das in XSLT 1.0 noch automatisiert verläuft und daher als unsicher bezeichnet werden muss. So werden in XSLT 1.0/XPath 1.0 Zahlen wie "1.23" als double gecastet, was jedoch zu Rundungsdifferenzen führen kann. In XSLT 2.0 / XPath 2.0 hat der Developer bessere Kontrolle über das Type-Casting.
<xsl:template name="Type_Casting">
<ergebnis>
<xsl:for-each select="//Mensch">
<xsl:if test="name castable as xs:string">
<Mensch>
<vn><xsl:value-of select="vorname"/></vn>
<einkommen>
<xsl:value-of select="xs:decimal(Gehalt)"/>
</einkommen>
</Mensch>
</xsl:if>
</xsl:for-each>
</ergebnis>
</xsl:template>
Mit some und every können Sie prüfen, ob einige oder alle Nodes eine bestimmte Bedingung erfüllen.
<xsl:template name="Alle_oder_Einige">
<ergebnis>
<xsl:choose>
<xsl:when
test="every $x in /Orte/Ort
satisfies $x/Mensch/Gehalt > 1000">
Alle Einwohner verdienen mehr als 1000 Euro
</xsl:when>
<xsl:when
test="some $x in /Orte/Ort
satisfies $x/Mensch/Gehalt > 1000">
Einige Einwohner verdienen mehr als 1000 Euro
</xsl:when>
<xsl:otherwise>
Niemand verdient mehr als 1000 Euro
</xsl:otherwise>
</xsl:choose>
</ergebnis>
</xsl:template>
Das Ergebnis ist dann leicht nachvollziehbar:
<ergebnis>Einige Einwohner verdienen mehr als 1000 Euro
</ergebnis>
XSLT 2 bzw. XSLT 3 - Prozessoren arbeiten durchweg auf einer anderen Basis als XSLT 1-Prozessoren, die Ergebnisse weichen teilweise stark von einander ab. Hinzu kommt der beträchtlich erweiterte Funktionsumfang , der jenen von XSLT 1 um ein Vielfaches übersteigt. Bei der Migration von XSLT 1 nach XSLT 2 oder gar XSLT 3 empfiehlt es sich, auf Extensions generell zu verzichten und konsequent auf Standards zu setzen. Es läuft auf eine komplette Neuimplementierung samt umfangreichen Regressionstest hinaus.
wg / 27. Juni 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