XSL - Übersicht / XSLT 2.0: Erweiterte Syntax

XSLT 2.0: Erweiterte Syntax

XSLT 2.0: Erweiterte Syntax

In XSLT 2.0 besteht die Möglichkeit, komplexe Logiken (Schleifen, Bedingungen) mit Hilfe einer erweiterten Syntax zusammenzufassen.

XSLT 2.0: Erweiterte Syntax

Auch hier können zum besseren Verständnis der Programmlogik lokale Kommentare sinnvoll sein. Diese lokalen Kommentare sind in der Syntax "(: Kommentar :)" abgefaßt.


<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 muß. 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 Typecasting.


  <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 / 4. Januar 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







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: info2018@wilfried-grupe.de

www.wilfried-grupe.de/XSL20_erweiterte_Syntax.html