Ein einfaches Streaming Stylesheet könnte z.B. so aussehen:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="#all"> <xsl:output method="xml" indent="yes"/> <xsl:mode on-no-match="shallow-copy" use-accumulators="entry-count" streamable="true"/> <xsl:accumulator name="entry-count" as="xs:integer" initial-value="0" streamable="yes"> <xsl:accumulator-rule match="entry" select="$value + 1"/> </xsl:accumulator> <xsl:template match="/"> <result> <xsl:apply-templates/> <count> <xsl:value-of select="accumulator-after('entry-count')"/> </count> </result> </xsl:template> </xsl:stylesheet>Plain Text
Diese Stylesheet hat einige Besonderheiten:
Zum einen wird darin ein Default-Modus deklariert, der jeden Knoten der Eingabeinstanz über eine implizite Identity-Transformation (shallow-copy) Verarbeitungsmethoden Shallow Copy in die Ausgabeinstanz kopiert.
(Auf herkömmlichem Weg würde man dafür ein Templates, wie dieses, verwenden:)
<xsl:template match="node()|@*" <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template>Plain Text
Zum anderen wird ein Akkumulator Verarbeitungsmethoden Akkumulator verwendet.
Ber der Verarbeitung sehr großer Datemengen, sind aber zuweisbare Variablen unumgänglich, denn sonst würde der Laufzeitstapel schnell an seine Grenzen gelangen.
Ein Akkumulator akkumuliert Werte. Das können atomare Typen sein, wie im obigen Beispiel, aber auch Datenstrukturen können aufgebaut werden, wie bspw. der gerade prozessierte Teilbaums in einem Dictionary.
Im Akkumulator muss das streamable="yes" Property gesetzt sein, wenn er im Streaming-Modus arbeiten soll. In diesem Modus kann der Akkumulatorwert erst ausgelesen werden, wenn der untersuchte Baum vollständig durchlaufen wurde.
Um die Unterschiede zum "normalen" XSLT Betrieb festzustellen, können im obigen Beispiel einige Änderungen vorgenommen werden, die der Streaming Prozessor nicht akzeptiert. Diese vermeintlich fehlerhafte Eingabe quittiert Saxon mit der folgenden Fehlermeldung:
Cannot call accumulator-after except during the post-descent phase of a streaming templatePlain Text
Dieser Durchlauf kann auch ein reines Kopieren sein, bspw. kann man den apply-templates Call auch durch ein...
<xsl:copy-of select="."/>Plain Text
... ersetzen, was gleichbedeutend mit der Mode Einstellung
on-no-match="deep-copy"Plain Text
wäre. Wie man sieht hat sich in XSLT 3.0 viel bzgl. der Handhabung verschiedener Verarbeitungsmodi getan. Anstatt Default-Match Regeln zu schreiben, setzt man in der Stylesheet Deklaration bestimmte Modus Properties, die den Baumdurchlauf auf verschiedene Arten realisieren.