Übersicht zu XSLT 3.0

(Die Inhalte der folgenden Seiten zu XSLT 3.0 wurden uns freundlicherweise von Studenten der Hochschule der Medien Stuttgart im Rahmen des Seminars "Markup Languages und Anwendungen" vom 16.01.2016 zur Verfügung gestellt. Wir bedanken uns herzlich bei Philipp Burger, Jonas Häfele, Lena Krächan und Arno Pitters für die gelungene Präsentation zu XSLT-Streaming und die anschaulichen Übungen.)

   

XSLT 3.0 wurde gemeinsam mit XPath 3.0 entwickelt. Beide Sprachen basieren auf dem neuen Datenmodel XDM 3.0 (XQuery and XPath Data Model 3.0). Somit ist das Ganze als ein gemeinsames Update des Standards zu sehen. Einzelne Features einer Sprache zuzuweisen fällt schwer, da diese über die verschiedenen Sprachen verteilt sind, meistens miteinander interagieren und aufeinander aufbauen.

Manche der Funktionen, welche früher in XSLT definiert wurden, sind nun in der Functions-Library XPath and XQuery Functions and Operators 3.0 definiert.

Im Folgenden finden Sie eine Auflistung der wichtigsten neuen Funktionen von XSLT 3.0:

Higher-Order Functions

XPath 3.0 ermöglicht es, anonyme Funktionen zu definieren, und das XDM 3.0 wurde um ein function-Element erweitert. Dies erlaubt es, Lambda-Funktionen wie (x, y) # x*x + y*y zu verwenden. Siehe das folgende Code-Beispiel.

Code-Beispiel: Der Variable f1 wird eine anonyme Funktion zugewiesen, welche einen Integer als Parameter hat und eine Funktion als Rückgabewert. Diese Funktion hat wiederum einen Integer als Parameter und einen Integer als Rückgabewert.

<xsl:template match="/">
  <xsl:variable name="f1" select="
    function($x as xs:integer) as (function(xs:integer) as xs:integer){
      function ($y as xs:integer) as xs:integer{
        $x*$x + $y * $y
      }
    }
  "/>
  <xsl:value-of select="$f1(10)(3)"/>
</xsl:template>

Zeile 2: Definition der Variable f1 und Zuweisung einer anonymen Funktion.

Zeile 3: Funktionsdeklaration. Hier werden zwei anonyme Funktionen definiert. Wobei eine Funktion der Rückgabewert der anderen ist.

Zeile 4: Deklaration der zweiten Funktion. Hier wird die Funktion definiert, welche y als Integer-Parameter hat und einen Integer zurückliefert.

Zeile 5: Im Funktions-Body werden die Potenzen der zwei Parameter gebildet und summiert.

Zeile 9: Die Funktion wird nun mit den Werten "10" und "3" aufgerufen.

Einige Standard Lambda-Funktionen wie map, filter, fold-left, fold-right oder mappairs sind bereits in der Funktions-Library enthalten.

Text-Manipulationen

Funktionen der Text-Manipulation, welche für das Formatieren von Zahlen, Daten und Zeit nützlich sind, gab es bereits in XSLT 1.0. Diese wurden dann nach XPath verschoben, um sie auch in XQuery nutzen zu können. XPath 2.0 hat eine ganze Reihe an Funktionen hinzugefügt: tokenize, matches, replace, string-join, upper-case und lower-case. In XPath and XQuery Functions and Operators 3.0 sind weitere Funktionen dazu gekommen, die für das Parsen von CSV-Dateien nützlich sind (unparsed-text-lines, unparsed-text-available). Siehe das folgende Code-Beispiel.

Code-Beispiel: Hier wird die Kopfzeile einer CSV-Datei mit der Funktion unparsed-text-lines($csv) verarbeitet.

<xsl:param name="csv" select="'test.csv'"/>
<xsl:param name="seperator" select="','"/>
<xsl:variable name="head" select="tokenize(unparsed-text-lines($csv)[1], seperator)"/>

Maps

Maps sind ein neuer Datentyp, welcher das Typ-System von XPath 3.0 erweitert. Um mit Maps arbeiten zu können, wurden neue Funktionen in XPath sowie einige neue XSLT-Konstrukte eingeführt.

Eine Map besteht immer aus einem "Key" und einem "Value". In der Map dürfen keine Elemente mit demselben Key vorhanden sein. Eine Map verhält sich ähnlich wie eine HashMap in Java.

Beispiel einer Map-Funktion, welche den Wert für einen $key ausgibt:

map:get($map, $key)

Weitere Map-Funtionen:

  1. map:merge($maps as map(*)*) as map(*)
  2. map:size($input as map(*)) as xs:integer
  3. map:contains($map as map(*),$key as xs:anyAtomicType) as xs:boolean
  4. map:put($map as map(*),$key as xs:anyAtomicType,$value as item()*) as map(*)
  5. map:remove($map as map(*),$key as xs:anyAtomicType) as map(*)

Streaming

Diese Ausarbeitung beschäftigt sich hauptsächlich mit dem XSLT-Streaming, welches auf den folgenden Seiten genauer beschrieben wird. Außerdem werden neue Elemente und ihre Funktionen anhand von ausführlichen Beispielen sowie Übungen erklärt und ihre Verwendung verdeutlicht. Siehe XSLT-Streaming.

Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: