Burst-Mode

Der durch das Streaming bedingte einmalige Durchlauf des XSLT-Prozessors durch die Datei führt zu den Streamability-Regeln. Bei der XSLT-Entwicklung können hierdurch viele Einschränkungen entstehen, da Stylesheets häufig anders als bisher in der Nicht-Streaming-Verarbeitung aufgebaut werden müssen (nur ein Abwärtsausdruck erlaubt). Dies ist allerdings nicht immer oder nur sehr schwierig möglich. Ein Beispiel wäre das Tauschen der Reihenfolge von Elementen in einer XML-Datei oder die Ausgabe einer Information aus einem vorherigen bzw. folgenden Element. (Vgl. Abel Braaksma. Lazy processing of XML in XSLT for big data. in: XML London 2013 Conference Prodeedings. Juni 2013. XML London 2013. S. 136.)

Teilweise können die Einschränkungen durch den sogenannten Burst-Mode umgangen werden. Dabei wird ein Einzelstück einer Datei in einer Variable gespeichert und dieser Sub-Tree anschließend in einem zusätzlichen Mode, ohne Streaming, verarbeitet. Somit stehen alle bisher bekannten Möglichkeiten zur Verfügung. Eine Einschränkung dabei ist, dass die XML-Datei in Einzelstücke unterteilt werden muss. Dies ist meistens kein Problem, da in einem Adressverzeichnis, einer Bücherliste, einer Fehler-Log etc. als XML-Datei die einzelnen Einträge (Adresse, Buch, Fehler) unabhängig voneinander verarbeitet werden können.

Der Sub-Tree kann mit Hilfe von snapshot(.) und copy-of(.) in einer Variable gespeichert werden. Mit beiden Funktionen wird der aktuelle Kontext inklusive aller Kind-Elemente gespeichert. Der Unterschied bei snapshot() ist, dass auch alle Vorfahren-Elemente inklusive Attribute gespeichert werden und somit der Zugriff auf die Hierarchie bestehen bleibt.

Folgende Bedingungen müssen hierfür auf die Input-Datei zutreffen:

  1. Die Datei muss in einzelne Sub-Trees unterteilt werden können. Diese müssen alle Informationen, welche zur Verarbeitung benötigt werden, enthalten.

    Der Sub-Tree sollte so groß wie nötig, aber so klein wie möglich gewählt werden.

  2. Jedes geparste Einzelstück der Datei muss in den Arbeitsspeicher passen.

    Achtung: Ein geparster XML-Baum nimmt etwa den 3- bis 10-fachen Speicherplatz einer Datei in Anspruch. (Vgl. Michael Kay. Streaming in XSLT 2.1. in: XML Prague 2010 Conference Prodeedings. Februar 2010. XML Prague 2010. S. 4.)

Der Burst-Mode ermöglicht somit die Verarbeitung von Dateien, welche nicht am Stück in den Arbeitsspeicher geladen werden können, für deren Verarbeitung aber Teilstücke einer Datei ausreichend sind. (Vgl. Abel Braaksma. Lazy processing of XML in XSLT for big data. in: XML London 2013 Conference Prodeedings. Juni 2013. XML London 2013. S. 136.)

Die Verarbeitungsdauer einer Datei mit dem Burst-Mode verhält sich linear zur Dateigröße. Somit kann leicht die Dauer zur Verarbeitung einer Gesamtdatei aus einem Teilstück ermittelt und anschließend berechnet werden. Dies ist durch die Funktionsweise von Streaming möglich. (Vgl. Abel Braaksma. Lazy processing of XML in XSLT for big data. in: XML London 2013 Conference Prodeedings. Juni 2013. XML London 2013. S. 140-142.)

Im folgenden Code-Beispiel ist die Anwendung des Burst-Modus gezeigt.

Code-Beispiel: Einführungsbeispiel-XSLT zum Burst-Mode.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
  <xsl:mode streamable="yes" on-no-match="shallow-copy"/> 
  <xsl:mode streamable="no" on-no-match="shallow-copy" name="no-Streaming"/>    
  <xsl:template match="Name">
    <xsl:variable name="copy" select="copy-of(.)"/>  
    <xsl:apply-templates select="$copy" mode="no-Streaming"/>
  </xsl:template>
  <xsl:template match="Name" mode="no-Streaming">
    <xsl:copy> 
      <xsl:apply-templates select="Surname"/>
      <xsl:apply-templates select="Firstname"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Einfaches Beispiel für die Anwendung des Burst-Modes zum Tauschen der Reihenfolge von Firstname und Surname.

Zeile 2: Streaming-Mode für die Verarbeitung der Datei als Stream.

Zeile 3: Zusätzlicher Non-Streaming-Mode für die Verarbeitung der Sub-Trees.

Zeile 5: Das Name-Element wird in der Variable copy gespeichert.

Zeile 6: Der gespeicherte Kontext wird im no-Streaming-Mode weiterverarbeitet.

Zeile 8: Das Template im no-Streaming-Mode greift für das Name-Element.

Zeile 10: Die Reihenfolge von Firstname und Surname wird getauscht. Hier stehen alle Möglichkeiten der XSLT-Verarbeitung zur Verfügung. Wird der Sub-Tree als eigenes Dokument angesehen, muss auf die Streaming-Einschränkungen keine Rücksicht genommen werden.

Übungen zum Burst-Mode

   

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