Home
Über mich
Veröffentlichungen

XML XML-Schema XPath XSL-T XSL-FO XQuery XProc SVG

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 translate, replace und concat, 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 / XQuery:


<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 tokenize 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 XML: Schwach strukturierte Dokumente 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 anonymen Funktionen 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 XQuery:


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