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



XPath / XPath-Operatoren / =>

=>

=>

➪ In XPath 3.0 erlaubt der =>-Operator, verschachtelte Funktionen in anderer Schreibweise zu formulieren.

Auf dieser Seite:

Nehmen Sie als Beispiel eine Verschachtelung der Funktionen , und , die eine Stringvariable nacheinander bearbeiten. Ursprünglich sieht Ihr Code vielleicht so aus:


<xsl:stylesheet 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     exclude-result-prefixes="xs" version="3.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:variable name="input" 
                  as="xs:string">XBCDPYZabmnth</xsl:variable>        
    <xsl:template match="/">
        <ergebnis>
          <xsl:value-of select="translate(
                 replace(
                    concat(
                       concat($input, 'tsi '), 
                          'sbumpnbbemmrnn'), 
                          'tsi', 'ist'), 
                          'BCDYZbmn', '')"/>
        </ergebnis>
    </xsl:template>
</xsl:stylesheet>

Aus meiner Sicht leichter nachvollziehbar ist die folgende Alternative:


<xsl:stylesheet 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     exclude-result-prefixes="xs" version="3.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:variable 
         name="input" 
         as="xs:string">XBCDPYZabmnth</xsl:variable>        
    <xsl:template match="/">
        <ergebnis>
          <xsl:value-of select="concat($input, 'tsi ') 
                              => concat('sbumpnbbemmrnn') 
                              => replace('tsi', 'ist') 
                              => translate('BCDYZbmn', '')"/>
        </ergebnis>
    </xsl:template>
</xsl:stylesheet>

Dasselbe funktioniert selbstverständlich auch mit XPath 3.0 / :


<ergebnis>{
      "XBCDPYZabmnth " 
      => concat('tsi ') 
      => concat('sbumpnbbemmrnn') 
      => replace('tsi', 'ist') 
      => translate('BCDYZbmn', '')
}</ergebnis>

Das einfache Resultat:


<ergebnis>XPath ist super</ergebnis>

Auswertung nicht XML-wohlgeformter Textdateien

Das folgende Beispiel liest eine Datei aus, die im XML-Sinn nicht wohlgeformt ist, parst diese als XML-Fragment, splittet die Einzelwerte mithilfe von auf und filtert jene Werte heraus, die als xs:integer gecastet werden können.


unparsed-text('C:/input/mixedcontent_testdat.txt') 
=> tokenize(',') 
=> for-each(function($p){ 
      if($p castable as xs:integer) 
      then (xs:integer($p)) 
      else () }) 
=> sum()

Dabei hat die gelesene Inputdatei "C:/input/mixedcontent_testdat.txt" diesen Inhalt:


'Nikki Nixlos'; 'Selma Selbstlos';38; 57; 76; 95;
114;133;152;
171;
190;'dateiende'

Die ermittelte Zahlensequenz ist:


38
57
76
95
114
133
152
171
190

Die Summe der Einzelwerte ist dann


1026

Dieselbe Logik findet auch Anwendung bei dem in genannten Beispiel, hier wird die Zahlenreihe


18
38
57
63
76
95

addiert zum Gesamtergebnis 347.

Anonyme Funktionen und der =>-Operator

Den =>-Operator können Sie auch mit verwenden:


<xsl:stylesheet 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  exclude-result-prefixes="xs" version="3.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:variable name="input" as="xs:integer">9</xsl:variable>
  <xsl:variable name="faddiere"
    select="
      function ($x as xs:integer, $y as xs:integer) as xs:integer {
        $x + $y
      }"/>
  <xsl:variable name="fquadriere"
    select="
      function ($x as xs:integer) as xs:integer {
        $x * $x
      }"/>
  <xsl:template match="/">
    <ergebnis>
      <xsl:value-of select="$faddiere($input, 10) => $fquadriere()"/>
    </ergebnis>
  </xsl:template>
</xsl:stylesheet>

Dasselbe in :


let $input as xs:integer := 9
return <ergebnis>{
      let $fquadriere := function($x as xs:integer) 
                         as xs:integer {$x * $x}
      let $faddiere   := function($x as xs:integer, $y as xs:integer) 
                         as xs:integer {$x + $y}
      return $faddiere($input, 10) => $fquadriere()
      }</ergebnis>

Das ebenso einfache Resultat:


<ergebnis>361</ergebnis>

wg / 3. April 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/arrow.html