Als ich mir kürzlich meinen Code vor zehn Jahren zu Gemüte führte, fiel mir ein sehr seltsames Stück XSLT auf, sinngemäss:
Datei: common/semantic-tables.xsl <xsl:template name="maintenance-table"> <cals-table-structure> [...] <<xsl:apply-templates select="maint-int"/> [...] </cals-table-structure> </xsl:template> <xsl:template match="maintenance-table"> <xsl:variable name="maintenance-table"> <xsl:call-template name="maintenance-table"/> </xsl:variable> <xsl:apply-templates select="$maintenance-table"/> </xsl:template>Plain Text
Was hat mich denn da geritten? Ich bin ich dann schon darauf gekommen... Der Clou ist hier eine Vortransformation innerhalb einer Match-Regel.
Die Transformation innerhalb der Variablen rendert die semantischen Elemente der Wartungstablle, wie z.B. das Wartungsintervall maint-int , in eine CALS-Tabelle.
Diese wird dann im nächsten Transformationsschritt entweder nach XSL-FO oder nach HTML transformiert, je nachdem welche Haupt-Datei main.xsl das Modul semantic-tables.xsl importiert.
Datei html/main.xsl <xsl:import href="common/semantic-tables.xsl"/> <xsl:template match="cals-table-structure"> <html-tabllen-struktur> [...] </html-tabllen-struktur> </xsl:template> Datei pdf/main.xsl <xsl:import href="common/semantic-tables.xsl"/> <xsl:template match="cals-table-structure"> <pdf-tabllen-struktur> [...] </pdf-tabllen-struktur> </xsl:template>Plain Text
Dieser Ansatz ist sehr flexibel, denn im herausfaktorisierten Tabellenalgorithmus können leicht Sonderfälle, wie Duplikat-Eliminierung oder spezielle Merge-Operation, abgefangen werden. Zudem können sowohl das Named-Template bzgl. der Wartungstabelle als auch die Match-Regel im importierenden Stylesheet überschrieben werden, was der Kreativität keine Grenzen setzt.