Gerrit Imsieke, transpect user Group 2023
(nested styles)
Modifizierte Datei aus dem Testset von Hogrefe Bern
xsl:accumulator
-VerbesserungenBis August 2023 | Seit 7.8.2023 (nur Initialen) | Seit 10.11.2023 (Rest) | |
---|---|---|---|
XSLT-Durchläufe* | 22 | 22 | 20 |
Laufzeit* | 68 min** | 7 min | 1:30 min |
Darstellung im EPUB*** |
* nur idml2xml, nicht der gesamte Konvertierungs- und Prüfprozess
** die sehr lange Laufzeit trat nur bei komplexen Nested Styles auf
*** das offensichtlich falsche Ergebnis trat bei Überlappung von Initialen und explizit zugewiesenem ZF auf
Anfang August, quasi gleichzeitig:
Bisher lief die Verarbeitung geschachtelter Formate in 4 Schritten:
span
mit ZF XY packenDefizite:
Sowohl beim Suhrkamp-Problem als auch beim Hogrefe-Problem konnten die regulären Ausdrücke wegen vorhandenen Markups keinen Splitpunkt-Kandidaten finden, weswegen im Konvertierungsergebnis bei Suhrkamp der ganze Absatz fett war und bei Hogrefe der ganze Absatz aus Initialen bestand.
Das Suhrkamp-Problem konnte die Kollegin Schmalfuß lösen, indem sie Zeichenbereiche mit dem speziellen ZF
No character style
auflöste.
Für eine allgemeine Lösung muss man wie gesagt im vorliegenden Textknoten die Inhalte anderer Textknoten desselben Absatzes berücksichtigen.
Mit herkömmlichem XSLT 2.0 würde man in jedem Textknoten neu ermitteln, wie der Text davor lautete, ob er mit einer Wortgrenze endet oder ob das Wort im nächsten Textknoten weitergeht und wie viel des vorangegangenen Textes durch die aktuelle Instruktion bereits verbraucht ist. Zunächst müsste man ermitteln, welche Instruktionen schon abgearbeitet wurden. Man muss also für jeden Textknoten die komplette Analyse des Absatzes (bis einschl. diesem Textknoten) von vorne durchführen.
Das wäre ähnlich ineffizient wie das Hochziehen der Splitpunktkandidaten, das im Hogrefe-Fall ca. 67 der 68 Minuten gebraucht hat
Normalerweise hat man bei XSLT während der Verarbeitung keinen Zugriff auf das bisherige Verarbeitungsergebnis. Aus diesem Grund laufen komplexere Verarbeitungen oft in mehreren Durchläufen, in denen Zwischenergebnisse im transformierten Dokument gespeichert werden, z.B. bei welcher Zeichenposition innerhalb des Absatzes ein Textknoten beginnt.
Die xsl:accumulator
-Instruktion bietet genau diesen Zugriff während der Verarbeitung: Man
kann mitzählen, bei welcher Zeichenposition man ist, man kann aber auch komplexere Strukturen wie die
aktuell aktive NestedStyle-Instruktion und den noch nicht von bisherigen Instruktionen abgedeckten
markup-unabhängigen Text mitführen und -berechnen.
Zu diesem Zweck kann man sich beliebige Akkumulatoren definieren, indem man ihnen einen Namen gibt und die Berechnungsvorschriften dafür spezifiziert, wie der Wert des Akkumulators sich ändert, wenn während der Dokumentverarbeitung ein Knoten betreten bzw. verlassen wird.
Das bietet drei Vorteile:
Für die beiden letzten Punkte gäbe es auch Möglichkeiten, sie mit XSLT 2 ohne Zerhacken des Absatzes zu gestalten. Der erste Punkt aber bleibt, und diese unaufwändige und textknotenübergreifende Methode, in einem Durchlauf die Kandidaten zu ermitteln und nur die tatsächlich wirksamen (z.B. 3. Doppelpunkt) zu taggen, geht in XSLT nur mit Akkumulatoren.
Der Akkumulator nested-style-instruction
(Ausschnitt)
xsl:accumulator
zunächst nur für die Verbesserung der Initialenbehandlung
brachte erhebliche Verbesserungen bei Laufzeit und Konvertierungsergebnissen beim Aufeinandertreffen von
Initialen mit Textknoten in Markup (z.B. explizit zugewiesenes Zeichenformat)xsl:accumulator
für die übrigen NestedStyle-Instruktionen brachte
weitere Laufzeitverbesserungen, außerdem leicht verbesserte Präzision beim Anwenden der Zeichenformate