C#.NET * C++ * JAVASCRIPT * PYTHON * XML
* XML-SCHEMA * XPATH * XSL * XSL-FO * SVG * XQUERY * XPROC



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 samt Namespaces deklarieren zu müssen, können Sie als Funktion verwenden. Freilich wird dieser Weg nicht bei allen (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 . 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 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