Home
Über mich
Veröffentlichungen

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

XPath / XPath-Funktionen / XPath: Sequenz-Funktionen / XPath: function

XPath: function

XPath: function

➪ In XSLT 3.0 gibt es die Möglichkeit, in einer Variablen einen anonymen Funktionsaufruf zu implementieren.

Statt wie in XSLT 2.0 eine xsl:function samt Namespaces deklarieren zu müssen, können Sie xsl:variable als Funktion verwenden. Freilich wird dieser Weg nicht bei allen Prozessoren (siehe dort HOF-Features) einheitlich unterstützt.

pic/anonyme_funktion.png

Im folgenden Beispiel werden der Funktion zwei Integer-Parameter übergeben, der Rückgabewert ist ebenfalls vom Typ Integer, er besteht aus der Addition beider Werte.


<xsl:variable 
     name="f1" 
     select="function($x as xs:integer, $y as xs:integer) 
             as xs:integer
             {$x + $y}"/>

Aufgerufen wird diese Funktionsvariable durch


<ergebnis>
        <xsl:value-of select="$f1(4, 5)"/> 
</ergebnis>

... und generiert dieses Ergebnis:


<ergebnis>9</ergebnis>

Möglich ist auch, die function ohne Zuweisung zu einer Variable direkt zu verwenden. Was dabei nicht funktioniert, ist die Verwendung des => Operators in diesem Sinn:


(4, 5) => function($x, $y){$x + $y} 

Die Funktion soll die beiden übergebenen Parameter addieren; der korrekte Aufruf lautet:


function($x, $y){$x + $y} (4, 5)

... oder (weit einfacher!):


(4,5) => sum()

Ebenso möglich ist, mehrere functions zu verschachteln. Im folgenden Beispiel wird eine Integervariable $input mit dem Wert 9 zunächst mit dem Wert 10 addiert; das Resultat wird daraufhin quadriert.


<?xml version="1.0" encoding="UTF-8"?>
<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:template match="/">
    <ergebnis>
      <xsl:value-of select="
          function($z as xs:integer) as xs:integer {$z * $z}(
             function($x as xs:integer, $y as xs:integer) as xs:integer 
                {$x + $y}($input, 10) 
          )"/>
    </ergebnis>
  </xsl:template>
</xsl:stylesheet>

Derselbe Code liest sich in XQuery so:


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

Das Resultat:


<ergebnis>361</ergebnis>

Siehe auch:

wg / 24. September 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/XSL304.html