4.1.1.1  In-Situ Vortransformation

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.