Große XML-Dateien in FrameMaker-Bücher verwandeln

Dank der XSL-Preprocessing-Fähigkeiten von FrameMaker 7.2 und 8 wird nicht zwingend ein externer XSL-Prozessor benötigt, um ein angeliefertes XML für unser Lieblings-DTP-Programm aufzubereiten. Im folgenden habe ich ein Beispiel zusammengestellt, wie man eine große XML-Datei in kapitelgerechte Häppchen aufteilen kann:

XML-Input und DTD

Basis des Beispiels ist diese XML-Datei, die pro <chapter> in Dokumente aufgeteilt werden soll:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book SYSTEM "sample.dtd">
<book>
    <chapter>
        <title>Titel des ersten Kapitels</title>
        <para>Ein schöner Absatz.</para>
        <para>Und noch einer...</para>
    </chapter>
    <chapter>
        <title>Titel des zweiten Kapitels</title>
        <para>Ein schöner Absatz.</para>
        <para>Und noch einer...</para>
    </chapter>
    <chapter>
        <title>Titel des dritten Kapitels</title>
        <para>Ein schöner Absatz.</para>
        <para>Und noch einer...</para>
    </chapter>
</book> 

Und dies ist die zugehörige DTD sample.dtd:

<!ELEMENT book (chapter)+>
<!ELEMENT chapter (title, para+)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT para (#PCDATA)>

XSL-Transformation

Vor den Elementen und müssen nun die im »Structure Developer’s Guide« beschriebenen Processing-Instructions <?FM book?> und <?FM document?> eingesetzt werden. Das erledigt dieses XSL-Stylesheet:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

<xsl:output encoding="UTF-8" method="xml" indent="no" 
    doctype-system="sample.dtd"
/>
<xsl:template match="/book">
    <!-- FrameMaker-Buch erzeugen -->
    <xsl:processing-instruction name="FM">
        <xsl:text>book</xsl:text>
    </xsl:processing-instruction>

    <!-- Das Buch-Element der EDD erzeugen -->
    <book>
        <xsl:for-each select="chapter">
            <!-- Die einzelnen Kapitel erzeugen -->
            <xsl:processing-instruction name="FM">
                <xsl:text>document "Chapter_</xsl:text>
                <xsl:value-of select="position()"/>
                <xsl:text>.fm"</xsl:text>
            </xsl:processing-instruction>
            <xsl:apply-templates select="."/> 
        </xsl:for-each>
    </book>
</xsl:template>

<!-- Kopieren aller anderen Elemente und Attribute -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Das unsichtbare Zwischenergebnis

Wenn Sie nun dieses Preprocessing-Stylesheet in der Datei structapps.fm korrekt angeben, wird eine transformierte XML-Datei erstellt, die dann von FrameMaker geöffnet wird und so aussieht:

<?xml version="1.0" encoding="UTF-8"?>
<?FM book?>
<!DOCTYPE book SYSTEM "sample.dtd">
<book><?FM document "Chapter_1.fm"?><chapter>
        <title>Titel des ersten Kapitels</title>
        <para>Ein schöner Absatz.</para>
        <para>Und noch einer...</para>
    </chapter><?FM document "Chapter_2.fm"?><chapter>
        <title>Titel des zweiten Kapitels</title>
        <para>Ein schöner Absatz.</para>
        <para>Und noch einer...</para>
    </chapter><?FM document "Chapter_3.fm"?><chapter>
        <title>Titel des dritten Kapitels</title>
        <para>Ein schöner Absatz.</para>
        <para>Und noch einer...</para>
    </chapter></book>

Sie können zu Testzwecken ja auch erst einmal diese Ergebnisdatei in FrameMaker öffnen. Richtig nett wird es natürlich nur, wenn Sie eine passende Strukturapplikation mit Template usw. eingerichtet haben.

Natürlich habe ich die Testdateien komplett hier, aber Sie sollten schon auch noch etwas zu tun haben 🙂

Dieser Beitrag wurde unter FrameMaker, XML/XSL veröffentlicht. Setze ein Lesezeichen auf den Permalink.