XML * XML-SCHEMA * XPATH * XSL * XSL-FO * SVG * XQUERY * XPROC * ANT * DIVERSES



XSL / XSLT-Tipps / XSLT 2.0: Erweiterte Syntax

XSLT 2.0: Erweiterte Syntax

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 &gt; 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>

Type-Casting

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>

Alle oder nur einige?

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 &gt; 1000">
    Alle Einwohner verdienen mehr als 1000 Euro
   </xsl:when>
   <xsl:when 
    test="some $x in /Orte/Ort 
          satisfies $x/Mensch/Gehalt &gt; 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>

Migration von XSLT 1.0 nach XSLT 2.0 bzw. XSLT 3.0

XSLT 2 bzw. XSLT 3 - 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.






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/XSL20_erweiterte_Syntax.html