Hallo liebe Gemeinde,
wie der Titel schon verrät, geht es hier um das Gruppieren von Elementen.
Ausgangssituation ist, das ich einen Absatz aus WordML in eine tiefer verschachtelte Struktur bringen möchte.
Der Codeschnipsel der XML-Datei sieht folgendermaßen aus:
Zu Erläuterung des Codes:
In WordML ist jeder Absatz ein <w>-Element, danach folgt ein <w:r> (Text-Run) und dann der eigentliche Text <w:t>. Das Element <w:r> kann Eigenschaften in Form des Elementen <w:rPr> enthalten, hier z.B: <w:b/> = fett, <w:i/> = kursiv usw.
Mit meinem XSLT-Skript:
gruppiere ich zuerst alle Elemente <w:r>, wenn die Eigenschaft <w:b> (fett) vorhanden ist. Wenn dies der Fall ist dann überprüfe ich in der aktuellen Gruppe, ob w:i/> (kursiv vorhanden ist).
Nach meinen Ausführungen nun das eigentliche "Problem":
Ich möchte gern diese Abfragen in eine / oder mehrere called-Templates / Funktioen auslagern, leider weiss ich nicht so recht wie ich es anstellen soll.
Der ober gezeigte Ausschnitt kann recht mächtig werden.
z.B. wenn kein <w:b/> vorkommt, dann muss im otherwise-Block nach <w:i/> gesucht werden, in diesem Block wieder nach Unterstrichen (<w:u/>).
Es können unzählige Möglichkeiten vorkommen, welche abzufangen sind:
Fett, Kursiv und unterstrichen dann wieder nur Unterstrichen und Kursiv, dann nur kursiv usw. Das wir ein sehr großes <xsl:for-each-group-Konstrukt.
Ich hoffe ihr könnt mir einen Denkanstoß geben.
Viele Grüße, Z-MAN
wie der Titel schon verrät, geht es hier um das Gruppieren von Elementen.
Ausgangssituation ist, das ich einen Absatz aus WordML in eine tiefer verschachtelte Struktur bringen möchte.
Der Codeschnipsel der XML-Datei sieht folgendermaßen aus:
Code:
<w:p> <w:r> <w:rPr> <w:b/> </w:rPr> <w:t>Hier </w:t> </w:r> <w:r> <w:rPr> <w:b/> </w:rPr> <w:t>ein</w:t> </w:r> <w:r> <w:rPr> <w:b/> <w:i/> </w:rPr> <w:t> längerer</w:t> </w:r> <w:r> <w:rPr> <w:b/> </w:rPr> <w:t> Text: </w:t> </w:r> <w:r> <w:rPr> <w:b/> <w:u w:val="single"/> </w:rPr> <w:t>e</w:t> </w:r> <w:r> <w:rPr> <w:b/> <w:u w:val="single"/> </w:rPr> <w:t>i</w:t> </w:r> <w:r> <w:rPr> <w:b/> <w:u w:val="single"/> </w:rPr> <w:t>nmal fett</w:t> </w:r> <w:r> <w:rPr> <w:b/> </w:rPr> <w:t>, </w:t> </w:r> <w:r> <w:rPr> <w:b/> <w:i/> </w:rPr> <w:t>fett u</w:t> </w:r> <w:r> <w:rPr> <w:b/> <w:i/> </w:rPr> <w:t>nd kursiv, </w:t> </w:r> <w:r> <w:rPr> <w:b/> <w:i/> <w:vertAlign w:val="superscript"/> </w:rPr> <w:t>k</w:t> </w:r> <w:r w:rsidRPr="00BB3F80"> <w:rPr> <w:b/> <w:i/> <w:vertAlign w:val="superscript"/> </w:rPr> <w:t>ursiv und hochgestellt</w:t> </w:r> </w:p>
In WordML ist jeder Absatz ein <w>-Element, danach folgt ein <w:r> (Text-Run) und dann der eigentliche Text <w:t>. Das Element <w:r> kann Eigenschaften in Form des Elementen <w:rPr> enthalten, hier z.B: <w:b/> = fett, <w:i/> = kursiv usw.
Mit meinem XSLT-Skript:
Code:
<xsl:template match="w:p[exists(w:pPr)]"> <p> <!-- Bedingung: Bold --> <xsl:for-each-group select=".//w:r" group-adjacent="exists(*/w:b)"> <xsl:choose> <!-- Bold ja --> <xsl:when test="current-grouping-key()"> <b> <xsl:for-each-group select="current-group()" group-adjacent="exists(*/w:i)"> <xsl:choose> <xsl:when test="current-grouping-key()"> <i> <xsl:apply-templates select="current-group()"/> </i> </xsl:when> <xsl:otherwise> <xsl:apply-templates/> </xsl:otherwise> </xsl:choose> </xsl:for-each-group> </b> </xsl:when></xsl:choose></xsl:for-each-group></p></xsl:template>
Nach meinen Ausführungen nun das eigentliche "Problem":
Ich möchte gern diese Abfragen in eine / oder mehrere called-Templates / Funktioen auslagern, leider weiss ich nicht so recht wie ich es anstellen soll.
Der ober gezeigte Ausschnitt kann recht mächtig werden.
z.B. wenn kein <w:b/> vorkommt, dann muss im otherwise-Block nach <w:i/> gesucht werden, in diesem Block wieder nach Unterstrichen (<w:u/>).
Es können unzählige Möglichkeiten vorkommen, welche abzufangen sind:
Fett, Kursiv und unterstrichen dann wieder nur Unterstrichen und Kursiv, dann nur kursiv usw. Das wir ein sehr großes <xsl:for-each-group-Konstrukt.
Ich hoffe ihr könnt mir einen Denkanstoß geben.
Viele Grüße, Z-MAN
Comment