XSL-Übersicht / 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.

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>

wg / 1. April 2018



Fragen? Anmerkungen? Tips?

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