as Gruppieren von folgenden Geschwistern mit demselben Namen und denselben Attributen verursacht eine Ausnahme in saxon

Ich habe einige XML-Dokumente (ähnlich wie docbook), die in xsl-fo umgewandelt werden müssen. Einige der Dokumente enthalten Gedichte, und die Zeilen der Gedichte werden in separaten p-Tags geschrieben. Die Verse sind durch br-Tags getrennt. Es gibt "page" -Tags, die irrelevant sind und ignoriert werden sollten.

Typisches Codebeispiel:

<h4>Headline</h4>
<p>1st line of 1st verse</p>
<p>2nd line of 1st verse</p>
<br/>
<p>1st line of 2nd verse</p>
<p>2nd line of 2nd verse</p>
<page n="100"/>
<p>3rd line of 2nd verse</p>
<h4>Other headline</h4>

Für die Ausgabe von xsl-fo möchte ich den gesamten Text eines Verses in einem einzigen fo: -Block zusammenfassen. Derzeit funktioniert der Mechanismus für Codestrukturen wie oben, es gibt jedoch einige Ausnahmen. Die eigentliche Vorgehensweise besteht darin, für jedes p-Tag zu entscheiden: - Bin ich die erste Zeile eines Verses? - Wenn ja: Sammeln Sie den gesamten Text dieses Verses und schreiben Sie ihn in einen fo: -Block. Verwenden Sie die Attribute des tatsächlichen (ersten) p-Tags, um die Formatierung des Blocks festzulegen. - Wenn nein: Inhalte schneller behandelt wurden, tun Sie nichts.

Eine erste Zeile ist ein p-Tag, dem unmittelbar ein h4- oder ein br-Tag (oder ein Seiten-Tag, dem selbst unmittelbar ein br-Tag vorausgeht) vorangestellt ist. Das war einfach zu entwickeln.

Das Sammeln des Textes eines Verses war für das gegebene Beispiel einfach: Gruppiere alle folgenden Geschwister, definiere die Gruppenenden mit h4- oder br-Tags, dann nehme ich die erste Gruppe und verwende alle p-Tags (ignoriere zwischen Seiten-Tags oder dem Ende h4) oder br tag).

In Code

<xsl:for-each-group select="following-sibling::*" group-ending-with="br|h4">
    <xsl:if test="position()=1">
        <xsl:for-each select="current-group()[not(self::h4) and not(self::br) and not(self::page)]">
            <xsl:apply-templates/>&crt;
        </xsl:for-each>
    </xsl:if>
</xsl:for-each-group>

Nun zu einem ähnlichen Codebeispiel:

<h4>Headline</h4>
<p class="center">1</p>
<p>1st line of 1st verse</p>
<p>2nd line of 1st verse</p>
<br/>
<p class="center">2</p>
<p>1st line of 2nd verse</p>
<p>2nd line of 2nd verse</p>
<page n="100"/>
<p>3rd line of 2nd verse</p>
<h4>Other headline</h4>

Nun sind die zentrierten p wie Unterüberschriften zu den folgenden Versen. Es ist nicht wirklich ein Vers, aber für meine Zwecke würde es ausreichen, wenn er vom eigentlichen Verstext getrennt wäre. Die leicht abweichende Regel, um den gesamten Text des aktuellen Verses zu erhalten, lautet daher: Gruppiere alle folgenden Geschwister und definiere die Gruppenenden mit h4 oder br tags oder durch ein p-Tag, das eine andere Klasse als das aktuelle p-Tag hat, dann nehme ich die erste Gruppe und verwende alle p-Tags (ignoriere zwischen Seiten-Tags oder dem End-Tag h4 oder br).

Deshalb habe ich den Wert des Klassenattributs des aktuellen p-Tags in einer Variablen namens attributes gespeichert und die Gruppenregel wie folgt definiert:

<xsl:for-each-group select="following-sibling::*" group-ending-with="br|h4|p[normalize-space(@class) != $attributes]">

In eturn, wenn versucht wird, festzustellen, ob ein p-Tag die erste Zeile eines Verses ist, kann nicht nur ein h4 oder br vorangestellt werden, sondern auch ein anderes p-Tag, das einen anderen Klassenattributwert hat.

Nun funktioniert dies in meiner Testumgebung in Oxygen mit Saxon-B9.1.0.6 einwandfrei. Die Transformation muss jedoch in Java mit Saxon9.jar durchgeführt werden, und die Verwendung einer Variablen innerhalb des Attributs group-ending-with von xsl: for-each-group löst eine Ausnahme aus.

nd jetzt stecke ich irgendwie fes

Könnten die Gruppierungsbedingungen besser definiert werden? Oder sollte dies vielleicht gar nicht mit Gruppierung geschehen, sondern mit einem ganz anderen Ansatz?

Die Quelldateien sind so, wie sie sind. Das Tagging ist möglicherweise nicht optimal, aber es ist so, wie es ist. Die Transformation ist nicht neu, sondern wurde nachträglich an unsere Bedürfnisse angepasst. Quellcode mit Gedichten wurde einfach früher vermieden, aber ich würde gerne eine Lösung dafür finden.

Jede Hilfe wäre sehr dankbar.

Freundliche Grüße

Christian Kirchhoff

Antworten auf die Frage(2)

Ihre Antwort auf die Frage