Onyx

XML/XSL/FO

XML  Formatierte Ausgabe von Daten
Trennung von Daten, Layout und Programm
XML - das Universalformat
XML als Datenlieferant
XSL - Layout und X-Path
XSL/T - XSL Transformation
XSL/T Engines
XSL-FO - XSL Formatierung und Konvertierung in PDF
XSL-FO Formatter
Strikte Trennung von Datenbestand, Layout und Programm
Ein Datenbestand, mehrere Ausgabeformate

XML - das Universalformat  

XML bedeutet 'Extensible Markup Language'. XML entstammt der Markup Language Familie, zu der auch HTML, Hypertext Markup Language, gehört. Markup Language heißt 'Auszeichnungssprache', Texte und Objekte erhalten durch die Auszeichnung mit 'Tags' Eigenschaften. Beispiel: Dieser Text wird<u>unterstrichen</u> gedruckt  liefert  Dieser Text wird unterstrichen gedruckt

W3C

Definiert wurde das XML-Format vom World Wide Web Consortium - W3C.
XML ist für Weiterentwicklungen offen, den bereits bestehenden XML-Sprachen wie XSL, FO und SVG lassen sich beliebige neue hinzufügen.
Der besondere Nutzen eines XML-Formats liegt darin, dass es sowohl Aussagen über die Daten als auch über deren Bedeutung macht.

XML als Datenlieferant  

Im Themenbereich Document Engineering dient eine XML-Datei wie die folgende als Datenlieferant. Die Daten sind in der XML-typischen hierarchischen Baumstruktur in öffnende und schließenden Tags eingebettet: <ort>Musterhausen</ort>

Beispiel adr.xml

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<?xml-stylesheet href="adr.xsl" type="text/xsl"?>
<kunde>
    <adresse>
        <vorname>Paul</vorname>
        <nachname>Mustermann</nachname>
        <strasse>Musterstraße 12</strasse>
        <plz>12345</plz>
        <ort>Musterhausen</ort>
    </adresse>
</kunde>

Aus der Baumstruktur in diesem Beispiel geht hervor, dass 12345 nicht eine beliebige Zahl sondern vielmehr eine Postleitzahl ist, die wiederum Teil einer Adresse ist, welche wiederum zu einem Kunden gehört.

Dies macht allerdings nur aus menschlicher Sicht und Interpretation Sinn. Eine Maschine (Engine) weiß nichts mit dem Tag und Begriff kunde anzufangen. Aus Maschinensicht handelt es sich zwar um ein XML-Format, welches in syntaktisch korrekter Baumstruktur vorliegt, dessen Bedeutung sich ihr aber nicht erschließt.

Das muss es aber auch nicht, denn dieses XML-Format dient lediglich als Datenlieferant. Es muss von der verarbeitenden Engine ausschließlich in seiner Baumstruktur erkenn- und lesbar sein.

XSL - Layout und X-Path  

XSL steht für 'Extensible Stylesheet Language'. Eine XSL-Datei beinhaltet die für das jeweilige Ausgabemedium - XHTML, PDF, Drucker - passenden Layoutanweisungen in der Stylesheet-Sprache XSL. Das folgende Beispiel dient der Generierung einer XHTML-Site:

Beispiel adr.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>
    <xsl:template match="/kunde/adresse">
        <html>
            <head/>
            <body style="font-weight:bold">
                <xsl:value-of select="."/>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Auch eine XSL-Datei unterliegt syntaktisch dem XML-Format. Darauf verweist dieser Eintrag im Header:
<?xml version="1.0" encoding="ISO-8859-1"?>
Die XML-Namespace-Einträge (xmlns) im Tag <xsl:stylesheet> geben bekannt, welche Tags syntaktisch erlaubt sind und von der Engine interpretiert und verarbeitet werden sollen. Bei den Namespace-Einträgen handelt es sich lediglich um Bekanntgaben, ein Zugriff auf die angegebenen URIs erfolgt nicht.

Durch Bekanntgabe der Namespaces sind die enthaltenen Tags für eine Engine der angegebenen XML-Sprache zuordbar und somit auch in ihrer spezifischen Bedeutung erkennbar. Das macht den Unterschied zur oben stehenden XML-Datendatei aus.
Eine XSL/T-Engine kann die Bedeutung des Tags <xsl:stylesheet> interpretieren, und sie erkennt match="/kunde/adresse" als X‑Path durch die Baumstruktur der XML-Datendatei und sie weiß gemäß der X-Path-Definition damit auch, dass mit <xsl:value‑of select="."/> der aktuelle Knoten gemeint ist, und dass damit auch dessen Child-Elemente, die Adressdaten, angesprochen sind.

XSL/T - XSL Transformation  

hello.pdf

XSL/T

In aktuellen Browsern lässt sich die oben gezeigte Datendatei unmittelbar transformiert aufrufen: adr.xml
Der Browser zeigt nicht etwa die Adress-Baumstruktur sondern vielmehr ein resultierendes Ergebnis an:
Paul Mustermann Musterstraße 12 12345 Musterhausen

Im Rahmen des Transformationsprozesses hat dabei die XSL/T-Engine des Browsers

die Datei adr.xml eingelesen,
über den dort vorliegend Referenzeintrag href="adr.xsl" auch die Datei adr.xsl eingelesen,
die darin enthaltenen Layoutanweisungen verarbeitet und
die Informationen beider Dateien zu einem Browser-gerechten XHTML-Resultat transformiert.

Aus technischer Sicht hat die XSL/T-Engine

auf Basis der Quellinformationen einen Dokumentenbaum generiert und diesen
auf Basis der Stylesheet-Informationen in einen Zielbaum umgewandelt.

Beispiel adr_xhtml.htm

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "DTD/xhtml1-strict.dtd">
<html>
    <head/>
    <body style="font-weight:bold">
        Paul Mustermann Musterstraße 12 12345 Musterhausen
    </body>
</html>

Transformation bedeutet in diesem Zusammenhang somit nicht mehr als die Umwandlung von einem XML-Format in ein anderes. Im vorliegenden Beispiel entspricht das Ergebnis der XML-Variante XHTML mit den spezifisch erlaubten XHTML-Tags auf Basis des Namespace-Eintrags xmlns="http://w3.org/1999/xhtml"

XSL/T Engines  

Neben den fest in Browsern integrierten Engines gibt es auch separate Engines wie z.B. das Open-Source-Produkt Xalan für Java oder C++ von Apache.

XSL-FO - XSL Formatierung und Konvertierung in PDF  

hello.pdf

XSL-FO

Soll das Ergebnis nicht Browser- sondern seitenorientiert sein und z.B. als PDF- PCL- oder PS-Datei vorliegen oder direkt an einen Drucker geschickt werden können, so benötigt man ergänzend ein weiteres Sprachmitglied der XML-Familie:
FO (Formating Object), eine XML-basierende Formatierungssprache.

Beispiel adr_fo.xsl

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:template match="/kunde/adresse">
        <fo:root>
            <fo:layout-master-set>
                <fo:simple-page-master master-name="myPage">
                    <fo:region-body/>
                </fo:simple-page-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="myPage">
                <fo:flow flow-name="xsl-region-body">
                    <fo:block font-weight="bold">
                        <xsl:value-of select="."/>
                    </fo:block>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>
</xsl:stylesheet>

Der Namespace xmlns:fo="http://www.w3.org/1999/XSL/Format" definiert, dass neben den XSL-Tags zusätzlich auch FO-Tags zulässig und verarbeitbar sind.

Das oben gezeigte Beispiel dient der Generierung einer PDF-Datei. Die Generierung kann ein XSL-FO Formatter durchführen wie z.B. FOP von Apache. Das Ergebnis ist eine PDF-Datei, die entsprechend dem Beispiel wiederum nur diese eine Zeile enthält:
Paul Mustermann Musterstraße 12 12345 Musterhausen

Der Generierungsprozess geschieht mehrstufig:

Zunächst erfolgt eine XSL/T Transformierung in ein reines FO-Format, XSL-Tags sind nicht mehr enthalten. Danach
generiert der Formatter aus dem FO-Baum ein Area-Baum, Areas sind geschlossene Bereiche wie sie z.B. das <fo:block>-Element definiert, und er
ermittelt grundlegene Seiteneinstellungen wie sie im <fo:layout-master-set>-Element definiert sind und er
führt die Aufteilung und Positionierung der Areas in den Seiten durch.
Abschließend überführt der Formatter das Ergebnis in das geforderte Output-Format.

XSL-FO Formatter  

FOP

Ein weit verbreiteter und leistungsfähiger Open-Source-Formatter ist der Java-basierende FOP von Apache.

Neben FOP sind auch diese Formatter gebräuchlich: Antenna House XSL Formatter, RenderX XEP Formatter, Unicorn Formatting Objects (UFO) Formatter, FOA (Formatting Objects Authoring tool), REXP (Render Engine from XML/XSL to PDF), jfor, Java XSL-FO to RTF converter, XMLmind FO Converter, Epic Editor V4.2, IBM formatter, XMLEditPro.

Strikte Trennung von Datenbestand, Layout und Programm  

Dokumentgenerierung in einer XML-Umgebung erzwingt eine strikte Trennung von

Datenbestand,
Layout und
umgebenden Rahmenprogramm

und unterstützt damit die Anforderungen des Document Engineerings. Da das Dokumenten-Layout separat verfügbar ist und nicht tief in einem Programm verborgen liegt, bleibt damit die gesamte Applikation übersichtlich.

Programmierer sind nicht immer zugleich auch die besten Layouter. so kann es hilfreich sein, wenn das Layout, also das XSL-Stylesheet, in Händen eines Layouters verbleibt und die weitere Technik in Händen eines Programmieres.
Zur Zeit muss der Layouter allerdings noch über gute Kenntnisse der XSL- und FO-Technik verfügen. Zwar gibt es WYSIWYG-arbeitende Layouteditoren wie z.B. stylevision von Altova/xmlSpy, doch stößt man bei speziellen Anforderungen sehr schnell an deren Grenzen. Gleiches gilt nach wie vor auch für HTML-Layouteditoren.

Ein Datenbestand, mehrere Ausgabeformate  

Liegt ein Layout separat vor, so ist es technisch recht einfach, verschiedene Output-Formate parallel oder alternativ zu bedienen. So ist der gleiche Datenbestand je nach Anforderung einfach durch Austausch der Stylesheets sowohl als PDF-Dokument als auch als XHTML-Site oder auch auf einem Drucker ausgebbar.

hello.pdf adr.xml

Ausgabeformate

In der Praxis funktioniert das allerdings nur bei einfacher Baumstruktur der XML-Datendatei reibungslos. Die Ursachen sind X-Path und ein Interessenkonflikt zwischen Datenbankdesigner und Layouter.

Der Datenbankdesigner fordert, dass die Daten entsprechend dem zugrunde liegenden Datenmodell logisch in einer entsprechenden Baumstruktur abgebildet werden.
Der Layouter ist darum bemüht, das Stylesheet möglichst einfach und übersichtlich zu halten. Erhält er in der Praxis die Anforderung, Daten unterschiedlichster Zusammenhänge gemeinsam in einer Tabelle abzubilden, so wird er mit einer Baumstruktur, die seine Layoutbelange nicht berücksichtigt, nur schwer leben können.

Grund ist der mitunter sperrige Datenzugriff über X-Path. Dieser kann ein Stylesheet sehr unübersichtlich machen. X-Path bietet bei weitem nicht den Komfort, den SQL-SELECT bietet, um Daten je nach Anforderung in neuen Sichten darstellen zu können.

Folglich wird der Layouter fordern, dass die Daten in einer Baumstruktur dargestellt werden, die für das Layout maßgeschneidert ist.

Dies kollidiert allerdings wiederum mit der Forderung, den Datenbestand universell zu halten, um unterschiedlichste Output-Formate bedienen zu können.

Ein nicht lösbarer Konflikt, der sich häufig pragmatisch zugunsten des Layouters entscheidet, sodass es je nach Anforderung nicht nur mehrere Stylesheets sondern u.U. auch mehrere spezifisch zugehörige XML-Datendateien gibt.

Damit lässt sich ganz gut leben, da XML-Datendateien oft nicht statisch sind sondern je nach Anforderung vom Rahmenprogramm dynamisch neu generiert werden. Geht es nicht gerade um die Erstellung eines Buchs sondern um Geschäftsdokumente wie z.B. Rechnungen, so gilt: XML-Datendateien sind flüchtig, XSL-Stylesheets dauerhaft.

© Onyx Multimedia GmbH, München