Homepage-Webhilfe Event-Banner

Grundlagen

XSL-FO (XSL Formatting Objects) ist eine Auszeichnungssprache, die es ermöglicht, eine XML-Datei zu formatieren. Da XSL-FO nicht auf die Daten einer XML-Datei zugreifen kann, wird XSL-FO i. d. R. mit XSLT (und XPath für die Adressierung) gemischt. XSL-FO ist im Gegensatz zu XSLT also weniger zur Transformation, sondern eher zur Formatierung gedacht.

Die Sprache XSL-FO ist XML basierend und wird in den meisten Fällen dazu genutzt, Ausgaben, die für den Druck bestimmt sind, zu erzeugen. Wie auch bei XSLT, ist ein sogenannter Prozessor (bei XSL-FO ein (XSL-)FO-Prozessor) erforderlich, um die „Konvertierung“ durchzuführen. Je nach verwendetem Prozessor sind unterschiedliche Ausgabeformate möglich. Geläufig sind unter anderem die Formate PDF, PostScript und RTF.


XSL-Transformations-Grafik Das in einer XSL-FO-Datei notierte Skript enthält XSL-FO-Elemente, die den Aufbau und Inhalt einer oder mehrerer Seiten beschreibt. Auf den Grundaufbau sowie das Seitenlayout gehen wir später noch genauer ein. XSL-FO-Skripte werden in Dateien mit der Endung .xsl oder .fo gespeichert. Als MIME-Typ wird i. d. R. text/xsl verwendet.

Wie bereits oben erwähnt, wird im Regelfall XSL-FO in Kombination mit XSLT verwendet. Es gibt dann also ein XML-Dokument, welches die „Daten“ für die Ausgabe enthält, und ein XSLT-Skript, welches als Ausgabe ein XSL-FO-Skript (inkl. den Daten) erzeugt (und nicht wie üblich ein HTML-Dokument). Das vom XSLT-Prozessor erzeugte XSL-FO-Skript kann dann mit Hilfe eines XSL-FO-Prozessors in eine andere Datei (z. B. in eine PDF-Datei) transformiert werden. Natürlich sollte das XML-Dokument als erstes noch mit dem XSL-Skript per Verarbeitungshinweis verlinkt werden:

<?xml-stylesheet href="stylesheet.xsl" type="text/xsl" ?>

Es wäre jedoch auch möglich, über einen anderen Weg (z. B. mittels einer serverseitigen Skriptsprache wie PHP) ein XSL-FO-Skript (inkl. dem „Inhalt“) zu erzeugen, um dann lediglich die Formatierung durch einen XSL-FO-Prozessor durchführen zu lassen.

Anders als CSS beschreibt XSL-FO nicht nur den Aufbau und den Stil eines Dokuments, sondern auch zugleich den Inhalt. Man könnte XSL-FO also als Kombination aus HTML und CSS sehen (natürlich mal abgesehen davon, dass XSL-FO für Druckausgaben konzipiert ist). Auf Grund dieser Tatsache ist ein XSL-FO-Skript nur dann wiederverwendbar, wenn es durch einen vorhergehenden Transformationsvorgang (wie z. B. mittels XSLT) erzeugt wurde.

Für den Transformations- bzw. Formatierungsvorgang wird ein sogenannter XSL-FO-Prozessor oder kurz FO-Prozessor benötigt. Solche Prozessoren sind in der Regel kostenpflichtig, es gibt jedoch auch ein paar kostenlose. Die kostenlosen Prozessoren sind jedoch teilweise in der Funktionalität und Unterstützung begrenzt.

Ein kostenloser XSL-FO-Prozessor, welchen auch wir für unsere Beispiele verwendet haben, ist Apache FOP von der Apache Software Foundation. FOP verfügt zwar immer noch über ein paar Probleme und unterstützt noch nicht den vollen Funktionsumfang von XSL-FO, ist jedoch alles in allem schon relativ gut und für einfache Zwecke mehr als ausreichend. FOP ist ein Java-Programm und kann entweder in ein eigenes Java-Projekt integriert werden oder über eine im Download-Paket enthaltene bat-Datei ausgeführt werden.

Apache FOP enthält neben dem eigentlichen FO-Prozessor auch einen XSLT-Prozessor, wodurch nur ein Transformationsvorgang notwendig ist, wenn aus einer XML- und XSL-Datei eine PDF-Datei (oder ein anderes Dokument) erzeugt werden soll. Dem FOP werden i. d. R. die Parameter -xml, -xsl und (bei einer Transformation in ein PDF-Dokument) -pdf mitgegeben. Das erste Beispiel (siehe Abschnitt Erstes Beispiel) wurde mit folgendem Kommando erzeugt:

fop.bat -xml erstes-beispiel.xml -xsl erstes-beispiel.xsl -pdf erstes-beispiel.pdf

Liegt als Grundlage nur ein reines XSL-FO-Skript vor (also ohne XML-Datei und XSLT-Skript), so werden die Parameter -xml und -xsl weggelassen und stattdessen der Parameter -fo verwendet. Ein Aufruf des fop.bat-Skripts könnte folgendermaßen aussehen:

fop.bat -fo schriftfarbe.xsl -pdf schriftfarbe.pdf

Für die Größenangabe von Blöcken, Grafiken, Schriften etc. stehen verschiedene Maßeinheiten zur Verfügung. Dabei ist es natürlich auch möglich, verschiedene Maßeinheiten in einem Dokument zu mischen. Gerade bei Druckmedien werden (z. B. für Größenangaben von Seiten oder Tabellenspalten) vor allem die Maßeinheiten cm (Zentimeter), mm (Millimeter) und in (Inch) von Bewandtnis sein. Bei Schriftgrößen oder ähnlichem wird vermutlich aber doch eher auf die Maßeinheiten pt (Punkte), pc (Picas) und px (Pixel) zurückgegriffen. Eine weitere Einheit ist em, welche die Höhe der Schrift repräsentiert und somit oft für Abstände verwendet wird.


Das Wurzelelement bei XLS-FO ist root, in welchem i. d. R. nur ein Attribut für den Namensraum spezifiziert wird. Als Namensraumpräfix wird üblicherweise fo verwendet. Da es sich bei einer XSL-FO-Datei auch um eine XML-Datei handelt, wird zudem in den meisten Fällen die XML-Deklaration am Dateianfang notiert.

<?xml version="1.0" encoding="UTF-8" ?>

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    
</fo:root>

Die wichtigsten Bestandteile eines XSL-FO-Skripts sind die sogenannten Blöcke. Blöcke zeichnen sich durch das Element block aus und bilden im Ausgabedokument einen Absatz. Innerhalb des block-Elements können Sie nun z. B. einen Text notieren. Die direkte Notation von Text oder einigen anderen Inhalten (also ohne das block-Element) ist nicht gültig und führt zu einem Transformationsfehler.

<fo:block>
    Hier steht Ihr Inhalt!
</fo:block>

In einem block-Element ist die Angabe einer Größe (also einer Breite und / oder Höhe) nicht möglich. Ist dies zwingend erforderlich, so muss das block-container-Element verwendet werden. Im block-container-Element können block-Elemente notiert werden. Das block-container-Element verfügt über die Attribute width und height, um die Breite und Höhe festzulegen.

<fo:block-container width="5cm" height="2cm">
    <fo:block>
        Hier steht Ihr Inhalt!
    </fo:block>
</fo:block-container>

Ein Block erstreckt sich (sofern nicht das block-container-Element mit einer Größenangabe verwendet wird) immer über die komplett verfügbare Breite und über die Höhe des Inhalts. Das block-Element kann man also mit dem div-Element von HTML vergleichen. Für Inhalte, die sich nur über die Breite des Inhalts erstrecken sollen (also wie beim HTML-Element span), können Sie in XSL-FO das Element inline (zu Deutsch inzeilig) verwenden. Dieses Element muss innerhalb eines block-Elements vorkommen und wird im Regelfall zu Formatierungszwecken (z. B. zum Hervorheben eines Worts in einem Text) verwendet.

<fo:block>
    Hier steht Ihr Inhalt mit <fo:inline font-weight="bold">Hervorhebung</fo:inline>!
</fo:block>

Nun ist es aber Zeit für das erste Beispiel: Im folgenden Beispiel verwenden wir ein XSLT-Skript, welches mit Hilfe einer XML-Datei ein XSL-FO-Skript erzeugt (so wie es in der Praxis üblich ist). Im Wurzel-Template (match="/") wird das Grundgerüst von XSL-FO erzeugt. Das Element layout-master-set und dessen Unterelemente legen die Vorlagen für die später verwendeten Seiten fest. Innerhalb der Unterelemente des page-sequence-Elements werden die Folgen von Seiten und auch der eigentliche Inhalt der Seiten angegeben. Auf diese und weitere Elemente gehen wir jedoch im nächsten Thema noch genauer ein. Innerhalb des flow-Elements erkennen Sie ein block-Element, in welchem der Inhalt des text-Elements aus der XML-Datei mittels des XSLT-Elements value-of platziert wird.

XML-Code:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<?xml-stylesheet href="erstes-beispiel.xsl" type="text/xsl" ?>

<text>
    Dies ist das erste Beispiel zu XSL-FO.
</text>

XSL-Code:

<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output method="xml" omit-xml-declaration="no" version="1.0" encoding="UTF-8" indent="yes" />
    
    <xsl:template match="/">
        <fo:root>
            <fo:layout-master-set>
                <fo:simple-page-master master-name="DIN-A4" page-height="297mm" page-width="210mm">
                    <fo:region-body region-name="inhalt" margin="2cm" />
                </fo:simple-page-master>
            </fo:layout-master-set>
            
            <fo:page-sequence master-reference="DIN-A4">
                <fo:flow flow-name="inhalt">
                    <fo:block>
                        <xsl:value-of select="/text" />
                    </fo:block>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>
</xsl:stylesheet>
VorschauPDF:

Wichtig: Im XSLT-Tutorial haben Sie kennengelernt, dass die meisten Browser über einen integrierten XSLT-Prozessor verfügen, um somit XML-Dokumente in HTML umzuwandeln. Jedoch enthält keiner der gängigen Browser einen XSL-FO-Prozessor, um somit z. B. eine dynamische Erzeugung eins PDF-Dokuments durch den Browser zu ermöglichen. Daher wurden alle unsere Beispiele mit dem Apache FOP von uns bereits in eine PDF-Datei transformiert, die Sie über das Vorschau-Icon anschauen können.

Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen OK