Accumulators
Accumulators sind mit XSLT 3.0 eingeführt worden, um Daten, die mit Streaming verarbeitet werden, sammeln, verarbeiten und für die spätere Verwendung speichern zu können. Die Verwendung ist nicht explizit für Streaming reserviert, sondern kann auch im Non-Streaming-Modus eingesetzt werden.
Werden Accumulators auf eine Baumstruktur angewendet, sind für jeden Knoten zwei weitere Werte verfügbar. Diese weden als "pre-descendant"- und "post-descendent"-Werte bezeichnet und sind über die Funktionen accumulator-before()
und accumulator-after()
erreichbar.
Für die Erstellung der Werte der Accumulators für einen gegebenen Dokumentenbaum gibt es zwei Möglichkeiten: Einmal durch die Auswertung der in der xsl:accumulator
-Deklaration definierten Regeln oder durch Kopieren von entsprechenden Knoten in einem anderen Baum. Die zweite Möglichkeit (Kopieren der Werte) bieten die Funktionen snapshot()
, copy-of()
oder die Anweisung xsl:copy-of
mit dem Zusatz copy-accumulators="yes"
für die Erstellung von Accumulator-Werten. Accumulator-Werte werden auch bei dem impliziten Aufruf der snapshot()
-Funktion bei der xsl:merge
-Anweisung ausgeführt.
Das folgende Code-Beispiel (Vgl. o. V. XSL Transformations (XSLT) Version 3.0.) wird hier zum besseren Verständnis genutzt. Accumulators werden hier genutzt, um Abbildungen in einem Kapitel zu nummerieren. Werden die Daten mit Streaming eingelesen, ist die xsl:number
-Anweisung nicht verfügbar und es können Accumulators genutzt werden, um die gleiche Funktionalität im Streaming-Modus zu erreichen.
Code-Beispiel: Accumulators - Einführungsbeispiel.
<xsl:accumulator name="figNr" as="xs:integer" initial-value="0" streamable="yes">
<xsl:accumulator-rule match="chapter" select="0"/>
<xsl:accumulator-rule match="figure" select="$value + 1"/>
</xsl:accumulator>
<xsl:mode streamable="yes"/>
<xsl:template match="figure">
<xsl:apply-templates/>
<p>Figure <xsl:value-of select="accumulator-before('figNr')"/></p>
</xsl:template>
Beispiel der Nummerierung von Abbildungen mit Accumulators im Streaming-Modus.
Zeile 1: Vor der Verwendung von Accumulator-Werten muss mit xsl:accumulator
ein Accumulator als Top-Level-Element deklariert werden. Über das name
-Attribut wird ein Name vergeben. Im as
-Attribut wird festgelegt, wie die Resultate des initial-value
- und des select
-Ausdrucks konvertiert werden. Da das Dokument über Streaming verarbeitet werden soll, muss streamable="yes"
angegeben werden.
Hier ist als Name figNr angegeben. Der Wert für die Nummerierung der Abbildungen soll als Integer verarbeitet werden. Der Wert wird nach definierten Regeln verarbeitet. Mit <xsl:accumulator-rule match="chapter" select="0"/>
wird der Wert bei jedem Kapitel auf 0 gesetzt und mit <xsl:accumulator-rule match="figure" select="$value + 1"/>
bei jeder Abbildung um eins erhöht.
Zeile 6: Hier wird ein Template definiert, das alle figure-Elemente im Streaming-Modus verarbeitet.
Zeile 8: In dem Paragraph wird an die Bezeichnung der Abbildung die Nummer angehängt. Das Resultat von select
wird nach den im Accumulator definierten Regeln verarbeitet und in einen Integer-Wert konvertiert. Die accumulator-before()
-Funktion gibt den Wert eines Accumulators zurück, bevor weitere Unterknoten des aktuellen Knotens verarbeitet werden.
<< zurück | vor >> |
Tipp der data2type-Redaktion: Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: |