- 1 Intro
- 2 Anwendungsgebiete
- 2.1 XSLT - die Programmiersprache im XML Bereich
- 2.2 Aktuelle und vergangene Anwendungen
- 2.3 Professionelle XML Verarbeitung
- 2.4 Technische Dokumentation
- 3 Wichtige Konzepte
- 3.1 Push vs. Pull Stylesheets
- 3.2 Eindeutigkeit der Regelbasis
- 3.3 Namespaces
- 3.4 Schemata
- 3.5 Standards
- 3.5.1 DITA
- 3.5.2 DITA Inhaltsmodell
- 3.5.1 DITA
- 4 Ausgewählte Themen
- 4.1 Transformationen mit XSLT
- 4.1.1 Vortransformationen
- 4.1.2 Komplexe XML-2-XML Transformationen
- 4.1.2.8 Vererbung
- 4.1.2.8 Vererbung
- 4.1.3 XSLT Streaming
- 4.1.3.1 XSLT Akkumulator
- 4.1.3.2 XSLT Iterator
- 4.1.4 Reguläre Ausdrücke
- 4.1.5 Modus vs. Tunnel Lösung
- 4.1.6 Identifikation mit
generate-id()
- 4.1.6.4 XPath-Achsenbereich selektieren
- 4.1.6.4.1 Funktionen und Module
- 4.1.6.4.1 Funktionen und Module
- 4.1.6.4 XPath-Achsenbereich selektieren
- 4.1.7 Webservice Calls mit doc() und unparsed-text()
- 4.1.8 Stylesheet-Parameter auf der Kommandozeile
- 4.1.9 Leerzeichenbehandlung
- 4.1.10 Mit
translate
Zeichen ersetzen
- 4.1.10.1 Spass mit dem Sequenzvergleich
- 4.1.11 Character Mappings in der Ausgabe
- 4.1.12 JSON mit XSLT 1.0 und Python lxml
- 4.1.1 Vortransformationen
- 4.2 Abfragen mit XQuery
- 4.2.5 XQuery als Programmiersprache
- 4.2.5.3
if..then..else
Ausdrücke
- 4.2.5.3.2 SQL Views in MarkLogic
- 4.2.5.3
if..then..else
Ausdrücke
- 4.2.6 Hilfreiche XQuery Schippsel
- 4.2.5 XQuery als Programmiersprache
- 4.3 XML Datenbanken
- 4.3.1 Connector zu Marklogic in Oxygen
- 4.3.2 Bi-Temporale Dokumente
- 4.3.2.1 Anlegen des Testszenarios auf der ML Konsole
- 4.3.2.2 Ausführen einiger Beispiel-Queries
- 4.3.3 Webapps mit MarkLogic
- 4.3.3.5 Wikipedia Scrapper Applikation
- 4.3.3.5 Wikipedia Scrapper Applikation
- 4.3.4 Dokument-Rechte in MarkLogic
- 4.3.5 MarkLogic Tools
- 4.3.5.1 EXPath Konsole
- 4.3.5.2 mlcp - MarkLogic Content Pump
- 4.3.5.3 Deployment-Tools
- 4.4 XSL-FO mit XSLT1.x
- 4.5 Testing
- 4.5.1 Validierung mit Schematron
- 4.5.2 Erste Schritte mit XSpec
- 4.5.1 Validierung mit Schematron
- 4.6 Performanz-Optimierung
- 4.1 Transformationen mit XSLT
- 5 Zusätzliches Know-How
- 5.1 XML Editoren
- 5.2 Quellcode-Versionskontrolle
- 5.2.1 Kurze Geschichte zur Versionskontrolle Test
- 5.2.2 GIT Kommandos
- 5.2.1 Kurze Geschichte zur Versionskontrolle Test
- 5.1 XML Editoren
- 6 Glossary
- 7 Tektur CCMS
4.1.3.1 XSLT Akkumulator
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>
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) ↗
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>
Zum anderen wird ein Akkumulator verwendet.
Normalerweise gibt es in XSLT keine Variablen, sondern nur Konstanten, wie das auch bei funktionalen Programmiersprachen der Fall ist.
Es gibt zwar schon länger eine Saxon-Erweiterung, die die mehrmalige Zuweisung eines Wertes an eine Variable erlaubte. Im Normallfall braucht man diese Eigenschaft aber nicht.
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 template
Diese Fehlermeldung erscheint, wenn man den
apply-templates
Call entfernt. Der Akkumulator wird also nur befüllt, wenn der Baum auch explizit durchlaufen wurde.
Dieser Durchlauf kann auch ein reines Kopieren sein, bspw. kann man den
apply-templates
Call auch durch ein...
<xsl:copy-of select="."/>
... ersetzen, was gleichbedeutend mit der Mode Einstellung
on-no-match="deep-copy"
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.
Die Verarbeitung großer Datenmengen ist aber mit Streaming etwas tricky!
Es sollte immer geprüft werden, ob auch ein ggf. konventionelles Performanz-optimiertes XSLT für den Anwendungsfall ausreicht.