vorheriges KapitelInhaltsverzeichnisStichwortverzeichnisFeedbacknächstes Kapitel


Tag 15

XSL (Extensible Stylesheet Language) und XSL-FO (XSL Formatting Objects)

Die XML-Technologiefamilie beinhaltet auch XSL (Extensible Stylesheet Language), das umfangreiche Formatierungsmöglichkeiten unterstützt, die als XML-Vokabular implementiert sind. XSL besteht aus einer Transformationssprache und einem höchst spezialisierten Dialekt für die Beschreibung von Objektformatierungen. Heute lernen Sie die folgenden Dinge kennen:

15.1 Struktur mit Format

Die vielfältigen visuellen und Multimediaelemente im Web haben die Forderungen nach Präsentationsmöglichkeiten für XML-Dokumente untermauert, die selbst für den Einsatz im professionellen Umfeld der Industrie geeignet sein sollen. Die konzeptuelle Abtrennung von Stil- und Strukturkomponenten in XML bietet viele Möglichkeiten, andere Markup-Vokabulare zu verwenden, um eine semantische Definition für Elemente zur Verfügung zu haben. Eine dieser Möglichkeiten haben Sie in Kapitel 14 kennen gelernt, wo Sie für die Formatierung von XML-Ausgaben in geeigneten Browsern Cascading Stylesheets (CSS) angelegt haben. XSL (Extensible Stylesheet Language) stellt eine weitere Methode dar, XML-Dokumenten eine Stil-Semantik zuzuordnen, um Ausgaben für den Bildschirm, für Druckmedien und sogar für die Sprachsynthese zu formatieren.

Wie in Kapitel 2 bereits angesprochen, können Sie sich XML-Elemente wie die Substantive einer gesprochenen Sprache vorstellen; die Attribute beschreiben diese Elemente genauer, so wie Adjektive Substantive ergänzen. Ergänzt man diese Metapher um eine semantische Definition, könnte man sich XSL-Anweisungen als die Verben im XML-Markup vorstellen. Letztlich kann XSL mehr, als nur eine stilbasierte Formatierungs- Semantik auszudrücken. XSL kann ein XML-Instanzdokument vollständig in eine andere Markup-Struktur umwandeln.

XSL Version 1.0 ist Anwärter auf die Empfehlung durch das W3C, die eine Sprache für die Entwicklung von Style Sheets beschreibt. Sie besteht aus den folgenden Elementen:

Insgesamt kann man also sagen, ein XSL-Stylesheet spezifiziert die Darstellung einer Klasse von XML-Dokumenten. XSL verwendet ein Formatierungs-Vokabular, um zu beschreiben, wie eine Instanz der Klasse in eine neue Baumstruktur umgewandelt oder entsprechend abgeändert werden kann. Die Transformationssprache (XSLT) kann jedoch unabhängig von der Formatierungs-Semantik (XLS-FO) eingesetzt werden, was auf den ersten Blick verwirrend scheint.

XSL-Namenskonventionen

Im ursprünglichen Vorschlag für XLS, welcher dem W3C im August 1997 vorgelegt wurde, verwendeten die Autoren (Microsoft Corporation, Inso Corporation, ArborText, Universität von Edinburgh und James Clark) das Akronym XSL als Abkürzung für »eXtensible Style Language«. Als im Dezember desselben Jahres der zweite Arbeitsentwurf vorgelegt wurde, stand XSL auch für »eXtensible Stylesheet Language«. Der Umfang der Spezifikation wuchs schnell an und es wurde deutlich, dass zwei verschiedene, allerdings verwandte Prozesse die Stilzuordnung von XML-Dokumente charakterisierten. Der erste beinhaltet eine strukturelle Umwandlung, wobei Elemente ausgewählt, gruppiert und neu angeordnet werden. Der zweite Schritt führt häufig zu einem Formatierungsprozess, der eine Darstellungs-Semantik für spezielle Benutzer-Agenten erzeugt, die die Dokumente auf Bildschirmen, Papier, in Sprache oder anderen Medien präsentieren. Im April 1999 wurde die logische Abtrennung dieser beiden Prozesse formal beschrieben, nämlich als XSLT-Funktionalität (Extensible Stylesheet Language Transformation), die in einem separaten Dokument formuliert wurde. Mit anderen Worten sagte man: XSL besteht aus XSLT für die Definition von Transformationen und XSL-FO (XSL Formatting Objects), um Darstellungsanweisungen für einen geeigneten Prozessor anbieten zu können.

Das Akronym XSL-FO wird in der offiziellen W3C-Empfehlung nicht erwähnt, ist aber in der XML-Industrie allgemein gebräuchlich und wird heute der Deutlichkeit halber verwendet. Sie sollten vor allem auf den Kontext achten, wenn Sie im Internet über XSL lesen, weil die Akronyme XSL, XSL-FO, XSL:FO, XSLFO, XSL/FO und andere Varianten manchmal synonym verwendet werden und dasselbe bedeuten.

Im Juli 1999 wurde XPath (XML Path Language), das Sie in Kapitel 9 kennen gelernt haben, von XSLT abgetrennt, um eine gemeinsame Syntax und die zugehörige Semantik für die Funktionalität zu beschreiben, die von XSLT (XSL Transformations) und XPointer (XML Pointer Language) gemeinsam genutzt wird. Aus Kapitel 11 wissen Sie, dass XPointer URIs mit XPath-Ausdrücken kombiniert, um Abschnitte externer XML- Dokumente für die weitere Verarbeitung zu spezifizieren.

Formatierungsobjekte erstellen und interpretieren

XSL Formatting Objects entstehen normalerweise aus der Umwandlung eines XML- Dokuments, das für Druckmedien vorgesehen ist. Sie können jedoch auch XSL-FO-Code schreiben, ohne ein Dokument umwandeln zu müssen, sodass Sie die Syntax und die Semantik genauer betrachten können. Das ist aber nicht typisch für die Vorgehensweise in der Praxis. Durch die manuelle Erstellung von Formatting Objects lernen Sie jedoch die FO-Syntax besser kennen.

Heute lernen Sie XLS kennen, indem Sie repräsentative Formatting Objects (XSL-FO) manuell erzeugen und verarbeiten. Morgen lernen Sie die Transformationssprache (XSLT) genauer kennen. Dabei wird nur ein kleiner Teil der praktischen Formatting Objects beschrieben, aber Sie erhalten Verweise auf Quellen, wo Sie weitere Informationen über andere Objekte finden.

Die Formatting Objects sind normalerweise nur ein Aspekt eines mehrstufigen Prozesses, der die Struktur eines XML-Quellbaums abändern soll. Ein Ergebnisbaum enthält Formatting Objects, nachdem die Transformation abgeschlossen ist. Das XSLT zum Erstellen von Formatting Objects beinhaltet also die Umwandlung eines XML- Dokumentbaums in einen Formatting Object-Ergebnisbaum. Man kann sich XML auch als Programmiersprache vorstellen, die sich in XML-Vokabular ausdrückt, das die Transformation eines Baumes detailliert regelt. XSL-FO ist nichts weiter als ebenfalls ein XML-Vokabular, wobei die Objekte Teile einer Bildschirmanzeige oder eines Seitenlayouts und ihre Eigenschaften darstellen.

XSL in der Praxis

Sie haben bereits mehrere verschiedene Prozesse und Vokabulare kennen gelernt, mit denen ein XML-Dokument abgeändert werden kann, um dem Inhalt einen bestimmten Stil zu geben. Die einzelnen Komponenten einer typischen Stilumwandlung mit Formatting Objects sind unter anderem:

Zukünftig werden vielleicht auch Benutzer-Agenten wie Webbrowser, Handys oder andere clientseitige Geräte die Interpretation von Formatting Objects unterstützen. Dadurch würden sich umfassende Formatierungsmöglichkeiten für plattformunabhängige Inhaltslösungen ergeben.

Angenommen, Sie haben ein XML-Dokument in Ihrem Unternehmens-Intranet abgelegt, das die administrativen Strategien für Ihr Unternehmen enthält. Möglicherweise wird dieses Dokument regelmäßig aktualisiert, um Änderungen der Arbeitgeberzulagen, Abrechnungsstrategien und anderer Vorgehensweisen zu veröffentlichen. Möglicherweise wollen Sie das Dokument in bestimmten Zeitabständen verarbeiten, um ein Strategie- Handbuch in PDF zu erstellen. Das PDF versteht Formatierungsinformationen, sodass Dokumente, die an unterschiedliche Kunden ausgegeben werden, wie beabsichtigt dargestellt werden, ohne dass dazu die Originalapplikation benötigt wird. Darüber hinaus unterstützen die meisten Browser unter Verwendung einer Browsererweiterung oder eines Plug-Ins den Ausdruck von PDF-Dokumenten, die aus dem Web heruntergeladen wurden. Auf diese Weise können Sie Daten gemeinsam nutzen, die nicht von den häufig unterschiedlichen Fähigkeiten der verschiedenen Browser abhängig sind, Webinhalt zu drucken.

Der XSL-FO-Prozess ist für diesen Zweck gut geeignet. Einem XML-Instanzdokument (corp.xml), das die Unternehmensstrategien und Richtlinien in geeigneten Elementen enthält, könnte ein XSL-Stylesheet (corp.xsl) zugeordnet werden, das die Formatierungsobjekt-Semantik für die Textgröße von Überschriften, hervorgehobenen Bereichen, Seitenrändern usw. enthält. Eine XSLT-Engine würde die beiden XML- Dokumente (corp.xml und corp.xls) als kombinierte Quellbäume in einer Transformation verarbeiten, die ein FO-Ausgabebaumdokument (corp.fo) erzeugt. Anschließend würde ein FO-Interpreter das FO-Ergebnisdokument verarbeiten, bei dem es sich um eine XML-Instanz handelt, um die Formatting Objects in Ausdrücke zu übersetzen, die als PDF-Ausgabe gespeichert werden (corp.pdf). Auf diese Weise können Sie elektronische Kopien der PDF-Datei an Angestellte senden und zwar unabhängig von den Plattformen, auf denen Ihre Client-Applikationen ausgeführt werden. Mit anderen Worten, egal ob ein Angestellter Unix-, Linux-, Macintosh- oder Windows-Software verwendet, die PDF-Unternehmensstrategie weist immer dieselbe Darstellung auf und wird auch immer gleich gedruckt. Jeder Benutzer startet eine von seinem eigenen Betriebssystem unterstützte Client-Applikation, die PDF-Dateien lesen und Ergebnisse identisch anzeigen und ausdrucken kann.

Der FO-Ergebnisbaum ist einfach nur ein XML-Dokument, das Elemente enthält, die zum FO-Namensraum gehören, der durch den URI http://www.w3.org/1999/XSL/Format identifiziert ist. Statt Transformationen auszuführen, um den FO-Ergebnisbaum zu erzeugen, erzeugt man heute FO-Dokumente unter Verwendung eines Editors, so wie man ein beliebiges XML-Dokument erstellt. Damit wird letztlich der Transformationsschritt übersprungen. Anschließend verarbeiten Sie diese Dokumente mit der FOP-Engine (Formatting Object Processor), wobei es sich um einen von XSL-FO gesteuerten Druck-Prozessor handelt. Der mit »Tag 15 Übungen« gekennzeichnete Abschnitt in Abbildung 15.1 zeigt den Teil der typischen XSL-Operation, den Sie heute kennen lernen.

Abbildung 15.1:  XSL-Operation mit Transformation erzeugenden Formatting Objects.

Apache FOP (Formatting Object Processor)

FOP ist eine Open Source Java-Applikation, die über die Apache Software Foundation im Internet kostenlos zu erhalten ist (http://xml.apache.org/fop/). Sie können aus mehreren solcher Prozessoren auswählen, unter anderem:

Der FOP-Prozessor, den Sie heute kennen lernen, unterstützt nicht die gesamte W3C XSL 1.0-Spezifikation. Deshalb handelt es sich zum Zeitpunkt der Drucklegung dieses Buches auch noch nicht um eine vollständige, sondern um eine potentielle Empfehlung des W3C und sie unterliegt in den folgenden Monaten möglicherweise grundlegenden Änderungen. Den Status der Empfehlung sowie die neuesten Informationen über XSL finden Sie unter http://www.w3.org/Style/XSL/.

FOP ist eine Java-Applikation, die einen Formatierungsobjektbaum liest und ihn in ein PDF-Dokument umwandelt. Außerdem bietet sie die Möglichkeiten, Ausgaben in mehreren anderen Formaten zu erzeugen (beispielsweise Text, MIF, PCL, AWT) und die Ausgabe direkt auf einen Drucker zu leiten. FOP nimmt FO-Ergebnisbäume in Form von XML-FO-Dokumenten entgegen, die zuvor in einem Texteditor oder mit einer XSLT- Engine erzeugt wurden. Darüber hinaus akzeptiert FOP auch direkte Eingaben von einem DOM- oder SAX-Parser, ohne dass eine Zwischenspeicherung als FO-Datei erfolgen muss. Heute erzeugen Sie das XML in Form von XML-FO-Instanzdokumenten und verarbeiten die Ergebnisbäume unter Verwendung von FOP.

Laden Sie sich eine Kopie der Release-Version des FOP von der Apache Project Website herunter (http://xml.apache.org/fop/). Folgen Sie dazu den Links zum Download im Distribution-Verzeichnis. Falls Sie Java-Entwickler sind und lieber mit dem neuesten Entwicklungscode arbeiten, können Sie auch eine Pre-Release-Version von FOP erhalten, wenn Sie den Links zur CVS-Version folgen. Wenn Sie jedoch den Pre-Release-Code herunterladen, müssen Sie den FOP-Prozessor selbst mit dem Sun Microsystems Java 2 Standard Edition javac-Compiler kompilieren. Unabhängig von der Distribution, die Ihre Bedürfnisse am besten abdeckt, müssen Sie bestimmte Java-Komponenten auf Ihrem Computer installieren, bevor Sie die FOP-Applikation ausführen können. Diese Versionen ändern sich ständig, deshalb sollten Sie die Distributionshinweise zu Ihrer Version sorgfältig lesen, um sicherzustellen, dass alle erforderlichen Komponenten auf Ihrem Computer installiert sind.

Die für die Verarbeitung der Beispiele dieses Kapitels verwendete Version bedingt, dass eine Java-VM installiert ist, die Sie von der Sun Microsystems Java 2 Standard Edition unter http://www.java.sun.com/j2se3 heruntergeladen haben.

Die Release-Version der FOP-Distribution beinhaltet mehrere Hilfsbibliotheken, unter anderem:

Wie bei allen Java-Applikationen müssen Sie sich selbst um die Namen der Verzeichnisse kümmern, die Ihre Distributions- und Bibliotheksdateien aufnehmen, um die Umgebungsvariablen, die den Pfad zu den Bibliotheken definieren, sowie um die Programmausführungsschritte. Folgen Sie sorgfältig der Dokumentation zur Installation und Programmausführung, die Sie zusammen mit FOP für Ihr Betriebssystem erhalten haben. In den nachfolgenden Übungen werden Sie FO XML-Dokumente schreiben und sie verarbeiten, um PDF-Ausgaben zu erzeugen. Die FOP-Version, die zum Zeitpunkt der Drucklegung dieses Buches erhältlich ist, wird aufgerufen, indem die folgende Zeichenkette in die Kommandozeile eingegeben wird:

fop -fo meineEingabeDatei.fo -pdf meineAusgabeDatei.pdf

Diese Zeichenkette teilt dem Prozessor mit, dass Sie ein FO-Dokument (meineEingabe Datei.fo) als Eingabe vorstellen und dass Sie von ihm erwarten, dass er die Formatting Objects interpretiert, um eine PDF-Ausgabedatei zu erzeugen (meineAusgabeDatei.pdf).

Die von Ihnen heruntergeladene FOP-Version verwendet jedoch möglicherweise eine andere Befehlszeilen-Zeichenkette. Die CVS-Version, die zum Zeitpunkt der Drucklegung dieses Buches verfügbar war, verwendet beispielsweise die folgende Syntax:

java org.apache.fop.apps.CommandLine meineEingabeDatei.fo meineAusgabeDatei.pdf

Es werden ständig neue Versionen von Apache FOP veröffentlicht. Lesen Sie sorgfältig in der Dokumentation zu dem von Ihnen heruntergeladenen Release nach, ob unterschiedliche Ausführungsanweisungen in der Befehlszeile, Umgebungsvariablen oder andere grundlegende Voraussetzungen erforderlich sind.

Um Ihre PDF-Ausgabedateien anzeigen zu können, müssen Sie auf Ihrem Computer einen PDF-Viewer installiert haben. Eine kostenlose Version des Adobe Acrobat Reader Version 5.0 oder höher erhalten Sie auf der Adobe-Website unter http://www.adobe.com/ products/acrobat/readstep.html.

Falls Sie den in FOP integrierten Viewer verwenden wollen, brauchen Sie keine Kopie von Acrobat Reader. Um die Viewer-Applikation aufzurufen, folgen Sie den Anweisungen im Abschnitt Running FOP (FOP ausführen) der Dokumentation. Wie die anderen Online-FOP-Anweisungen ist die Syntax der Befehlszeile von der von Ihnen heruntergeladenen und installierten Version abhängig. Die Dokumentation zeigt die aktuelle Zeichenkette für den von Ihnen erhaltenen Release.

Die Windows-Version von FOP beispielsweise verwendet die folgende Syntax in der Befehlszeile:

fop -fo meineEingabeDatei.fo -awt

Die CVS-Version verwendet folgende Befehlszeile:

java org.apache.fop.apps.AWTCommandLine meineEingabeDatei.fo

Die Eingabe dieser Zeichenkette bewirkt, dass das FO-Dokument (meineEingabeDatei.fo) verarbeitet wird und dass die formatierten Ergebnisse unter Verwendung eines FOP-Java- Viewers auf dem Bildschirm angezeigt statt in einer PDF-Datei gespeichert zu werden.

15.2 Formatting Objects

Gestern haben Sie die Optionen kennen gelernt, die Cascading Stylesheets für die Formatierung von XML-Dokumente in Hinblick auf die Darstellung unterstützen. Die XSL-FO-Spezifikation ist eine mit den vielfältigsten Funktionen ausgestattete Objektmenge, die die in CSS verfügbaren Stile weit übertrifft.

Objekte können die Paginierung sowie ein allgemeines Dokumentlayout steuern wie beispielsweise das root-Objekt. Das root-Objekt ändert nichts an der Formatierung der Seite, sondern identifiziert das Wurzelelement und stellt einen Container für alle anderen Objekte dar. Einige Formatierungsobjekte werden innerhalb anderer Objekte platziert. Beispielsweise stellt das Objekt fo:external-graphic einen Referenz-Link auf eine binäre Grafik dar, die sich außerhalb des FO-Ergebnisbaumdokuments befindet. Das Objekt page-number ist ein weiteres Beispiel für ein Objekt, das innerhalb anderer Seitenlayout- Objekte angelegt wird. XSL-FO stellt eine umfangreiche Objektmenge zur Formatierung von Tabellen bereit. Für jedes Tabellenobjekt können Eigenschafts-Attribute kodiert werden, mit denen man das Erscheinungsbild von fo:table-cell, fo_table-row, fo:table-column oder einer ganzen fo:table steuern kann. Eigenschafts-Attribute für ein Tabellenelement beinhalten Formate für padding, border, background-color usw.

Tabelle 15.1 bietet einen Überblick über die in der W3C XSL-FO-Spezifikation definierten Formatierungsobjekte (detaillierte Beschreibung: http://www.w3.org/Style/ XSL/) und gibt an, welche dieser Objekte von Apache FOP Version 1.1 unterstützt werden (Apache FOP-Dokumentation: http://xml.apache.org/fop/implemented.html). Objekte, die in FOP Version 1.1 nicht implementiert sind, sind in der Spalte FOP 1.1 mit N/A gekennzeichnet. Die Liste der verfügbaren Eigenschaften für diese Objekte in Form von Attributen ist relativ umfangreich.

Falls Sie vorhaben, XSL-FO regelmäßig zu verwenden, sollten sich mit der W3C- Dokumentation zu diesem Thema vertraut machen. Die Eigenschaften der Formatierungsobjekte finden Sie in Abschnitt 5.3 der Spezifikation unter http:// www.w3.org/TR/xsl/slice5.html#compcorr.

Formatting Object

Beschreibung

FOP 1.1

fo:basic-link

Wird für die Darstellung der Start-Ressource für einen einfachen Link verwendet

fo:bidi-override

Wird verwendet, wenn es erforderlich ist, den Standard-Algorithmus für die Unicode-Bidirektionalität unterschiedlicher (oder verschachtelter) Inline-Scripts in Dokumenten mit kombinierten Sprachen zu umgehen

N/A

fo:block

Wird allgemein für die Formatierung von Absätzen, Titeln, Überschriften, Abbildungs- und Tabellenunterschriften usw. verwendet

fo:block-container

Wird verwendet, um einen Referenzbereich auf Blockebene zu erzeugen

N/A

fo:character

Stellt ein Zeichen dar, das zur Darstellung auf einen Glyphen abgebildet wird

fo:color-profile

Wird zur Deklaration eines Farbprofils für ein Stylesheet verwendet

N/A

fo:conditional-
page-master-reference

Wird verwendet, um einen Seiten-Master zu identifizieren, der verwendet wird, wenn die entsprechenden Bedingungen erfüllt sind

fo:declarations

Wird verwendet, um globale Deklarationen für ein Stylesheet zu gruppieren

fo:external-graphic

Wird für eine Grafik verwendet, wobei sich die Grafikdaten außerhalb des XML-Ergebnisbaums im FO-Namensraum befinden

fo:float

Hat zwei Aufgaben: Kann verwendet werden, um während der normalen Platzierung eines Inhalts einen bestimmten Inhalt in einem separaten Bereich oben auf der Seite (oder auf Folgeseiten) zu platzieren, wo er immer gelesen werden kann, ohne den Leser sofort zu bemühen. Alternativ kann es auch verwendet werden, wenn ein Bereich in einem Randbereich verlaufen soll, während der normale Inhalt daneben angezeigt wird.

N/A

fo:flow

Stellt den Fließtextinhalt bereit, der auf die Seiten verteilt wird

fo:footnote

Erzeugt einen Fußnotenverweis und die zugehörige Fußnote

fo:footnote-body

Erzeugt den Inhalt der Fußnote

fo:initial-property-set

Gibt die Formatierungseigenschaften für die erste Zeile eines fo:block an

N/A

fo:inline

Wird häufig verwendet, um einen Textteil mit einem Hintergrund zu formatieren oder ihn in einen Rahmen einzuschließen

fo:inline-container

Wird verwendet, um einen Inline-Referenzbereich zu erzeugen

N/A

fo:instream-foreign-object

Wird für eine Inline-Grafik oder andere »generische« Objekte verwendet, wobei sich die Objektdaten in Ableitungen des fo:instream-foreign-object befinden

fo:layout-master-set

Eine Hülle um alle im Dokument verwendeten Master

fo:leader

Wird verwendet, um Leader zu erzeugen, die entweder aus einer Linie oder aus einer Zeile eines wiederholten Zeichens oder eines zyklisch wiederholten Zeichenmusters bestehen, das verwendet werden kann, um zwei Textformatierungsobjekte zu verbinden

fo:list-block

Wird zur Formatierung einer Liste verwendet

fo:list-item

Enthält die Beschriftung sowie den Rumpf eines Listenelements

fo:list-item-body

Enthält den Inhalt des Rumpfs eines Listenelements

fo:list-item-label

Enthält den Inhalt der Beschriftung eines Listenelements. Es wird normalerweise verwendet, um den Rumpf des Listenelements zu nummerieren, zu kennzeichnen oder zu verzieren.

fo:marker

Wird in Kombination mit fo:retrieve-marker verwendet, um fortlaufende Kopf- oder Fußzeilen zu erzeugen

N/A

fo:multi-case

Wird verwendet, um die einzelnen alternativen Unterbäume von Formatierungsobjekten aufzunehmen (in einem fo:multi-switch), aus denen das übergeordnete fo:multi-switch eines zur Anzeige auswählt und den Rest verbirgt

N/A

fo:multi-properties

Wird verwendet, um zwischen zwei oder mehr Eigenschaftsmengen zu wechseln, die einem bestimmten Teil des Inhalts zugeordnet sind

N/A

fo:multi-property-set

Wird verwendet, um eine alternative Menge mit
Formatierungseigenschaften anzugeben, die abhängig vom Status des Benutzer-Agenten auf den Inhalt angewendet werden

N/A

fo:multi-switch

Umschließt die Angabe alternativer Unterbäume von Formatierungsobjekten (jeder Unterbaum befindet sich innerhalb eines fo:multi-case) und steuert den Wechsel (aktiviert über fo:multi-toggle) von einer Alternative zu einer anderen

N/A

fo:page-number

Wird verwendet, um die aktuelle Seitennummer darzustellen

fo:page-number-citation

Wird verwendet, um auf die Seitennummer der Seite zu verweisen, die den ersten normalen Bereich enthält, der von dem angegebenen Formatierungsobjekt zurückgegeben wird

fo:page-sequence

Wird verwendet, um anzugeben, wie eine Unterfolge von Seiten innerhalb eines Dokuments erzeugt wird, beispielsweise ein Kapitel eines Berichts. Der Inhalt
dieser Seiten stammt von den Folgedokumenten der fo:page-sequence.

fo:page-sequence-master

Gibt Folgen von Seiten-Mastern an, die verwendet
werden, um eine bestimmte Seitenabfolge zu erzeugen

fo:region-after

Definiert einen Bereich, der sich hinter dem fo:region-body-Bereich befindet

fo:region-before

Definiert einen Bereich, der sich vor dem
fo:region-body-Bereich befindet

fo:region-body

Definiert einen Bereich, der sich in der Mitte des fo:simple-page-master befindet

fo:region-end

Definiert einen Bereich, der sich am Ende der Leserichtung des fo:region-body-Bereichs befindet. Bei europäischen Sprachen befindet sich dieser Bereich auf der rechten Seite.

fo:region-start

Definiert einen Bereich, der sich am Anfang der Leserichtung eines fo:region-body-Bereichs befindet. Bei europäischen Sprachen befindet sich dieser Bereich auf der linken Seite.

fo:repeatable-page-master-alternatives

Gibt eine untergeordnete Folge an, die aus wiederholten Instanzen mehrerer alternativer Seiten-Master besteht. Die Anzahl der Wiederholungen kann, muss aber nicht begrenzt werden.

fo:repeatable-page-master-reference

Gibt eine untergeordnete Folge an, die aus wiederholten Instanzen eines einzelnen Seiten-Masters besteht. Die Anzahl der Wiederholungen kann, muss aber nicht begrenzt werden.

fo:retrieve-marker

Wird in Kombination mit fo:marker verwendet, um laufende Kopf- oder Fußzeilen zu erzeugen

N/A

fo:root

Setzt sich aus Formatierungsobjekten zusammen. Es handelt sich dabei um den obersten Knoten eines XSL-Ergebnisbaums.

fo:simple-page-master

Wird verwendet, um Seiten zu erzeugen und die Geometrie dieser Seiten anzugeben. Diese Seite kann in bis zu fünf Bereiche unterteilt werden.

fo:single-page-master-reference

Gibt eine untergeordnete Folge an, die aus einer einzelnen Instanz statt aus einem einzelnen Seiten-Master besteht

fo:static-content

Enthält eine Folge oder einen Baum aus Formatierungsobjekten, die innerhalb eines einzelnen Bereichs dargestellt oder in gleich benannten Bereichen auf einer oder mehreren Seiten der Seitenfolge angezeigt werden sollen; wird häufig für wiederholte oder laufende Kopf- und Fußzeilen verwendet

fo:table

Wird zur Formatierung des Tabelleninhalts einer Tabelle verwendet

fo:table-and-caption

Wird verwendet, um eine Tabelle zusammen mit ihrer Überschrift zu formatieren

N/A

fo:table-body

Wird verwendet, um den Inhalt des Tabellenrumpfs aufzunehmen

fo:table-caption

Wird verwendet, um Formatierungsobjekte auf Blockebene aufzunehmen, die die Überschrift für die Tabelle nur dann enthalten, wenn fo:table-and-caption verwendet wird

N/A

fo:table-cell

Wird verwendet, um Inhalt zu gruppieren, der in Tabellenzellen platziert werden soll

fo:table-column

Gibt die Eigenschaften an, die auf Tabellenzellen angewendet werden können, die dieselbe Spalte und Größe haben

fo:table-footer

Wird verwendet, um den Inhalt der Tabellenfußzeile aufzunehmen

fo:table-header

Wird verwendet, um den Inhalt der Tabellenkopfzeile aufzunehmen

fo:table-row

Wird verwendet, um Tabellenzellen in Zeilen zu gruppieren

fo:title

Wird verwendet, um einem bestimmten Dokument einen Titel zuzuweisen

fo:wrapper

Wird verwendet, um ererbte Eigenschaften für eine Gruppe von Formatierungsobjekten anzugeben; hat keine zusätzliche Formatierungs-Semantik

Tabelle 15.1: W3C Formatting Objects, die von FOP Version 1.1 unterstützt werden 

Grundlegender FO-Aufbau

Für die erste Übung dieses Kapitels wollen wir annehmen, dass wir eine einfache PDF- Datei erstellen wollen, die nur eine Zeichenkette mit Text enthält - vielleicht eine Seite, die nur einen Seitentitel (Meine Nachrichten) für das Nachrichten- und Erinnerungssystem enthält, mit dem Sie in den vorherigen Kapiteln bereits gearbeitet haben. Sie werden eine FO-Datei anlegen und PDF als Ausgabeformat für den FOP-Interpreter auswählen.

Im Laufe der Zeit werden Sie der Seite auch noch andere Komponenten hinzufügen, aber ein Titel stellt einen guten Ausgangspunkt dar. Mit diesem grundlegenden Beispiel speichern Sie die Ausgabe als FO-Dokument-Instanz und erzeugen mit FOP eine PDF- Datei. Wenn Sie Java 2 oder Java Swing installiert haben, können Sie die Ausgabe auch unter Verwendung der Option -awt im FOP-Prozessor-Befehlsstring erzeugen. Beide Ergebnisse werden nachfolgend gezeigt.

Sie müssen Ihren Textstring für die Seitenüberschrift in ein geeignetes Markup einschließen, um eine PDF-Datei zu erzeugen. Es werden relativ wenige Auszeichnungsschritte benötigt, um einen einzelnen Textstring anzuzeigen, aber sie stellen eine Ausgangsschablone für komplexere Formate dar. Sie wissen, dass ein FO- Dokument einfach eine XML-Instanz ist. Sie legen sie mit Ihrem Texteditor an; achten Sie jedoch darauf, sie mit der Dateierweiterung .fo statt mit .xml zu speichern. Außerdem verwenden Sie das Präfix fo:, sodass sie als Proxy für den Formatting Objects-Namensraum dient (xmlns:fo=http://www.w3.org/1999.XSL/Format). Die FOP-Applikation fordert die Verwendung dieses Präfix.

Der FO-Namensraum ist im Wurzelelement des Dokuments deklariert. Das Wurzelelement eines XSL-FO-Dokuments ist immer:

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

Das Wurzelelement ist einfach nur ein Container, dafür gibt es keine Stilauszeichnung, obwohl es alle anderen Objekte des Dokuments enthält.

Wenn Sie schnell ein paar Seiten dieses Buchs durchblättern, erkennen Sie vielleicht, dass das Layout in Hinblick auf Seitenränder, die Platzierung von Überschriften und anderer allgemeiner Seitenelemente konsistent ist. Ihre bevorzugte Textverarbeitungs-Software weist möglicherweise ein ähnliches Konzept auf. Abbildung 15.2 zeigt das Menü Seite einrichten von Microsoft Word 2000, das beispielsweise Seitenränder und Optionen für die absolute Positionierung von Kopf- und Fußzeilen enthält. Um das Layout Ihrer Seiten zu ändern, passen Sie die Werte in den Feldern entsprechend an.

Abbildung 15.2:  Steuerelemente für die Seiteneinrichtung in  Microsoft Word 2000

Diese Einstellungen, deren Gültigkeitsbereich sich über das gesamte Dokument erstreckt, sind im Element fo:layout-master-set in XSL-FO enthalten. Mit anderen Worten, das Element fo:layout-master-set ist ein Containerelement, das die Eigenschaften des Master-Sets enthält. Innerhalb des Elements fo:layout-master-set befinden sich fo:simple-page-master-Elemente, die das Layout ähnlich wie die Definitionen in einer Textverarbeitung definieren. In XSL-FO können Sie mehrere fo:simple-page-master- Elemente angeben, um das Seitenlayout gegebenenfalls für einzelne Seiten festzulegen.

Für die fo:simple-page-master-Elemente benötigen Sie ein master-name-Attribut, das Sie mit einem von Ihnen gewählten Wert festlegen. Der Name ist erforderlich, damit Sie mehrere Master voneinander unterscheiden können. Die Syntax für das fo:simple-page- master-Element sieht folgendermaßen aus:

<fo:simple-page-master master-name="meinSeitenName">

Das fo:simple-page-master-Element definiert fünf Bereiche einer Standardseite: den Kopfzeilenbereich, den Fußzeilenbereich, den Dokumentrumpf sowie die Randbereiche links und rechts des Rumpfs. Der linke Randbereich wird auch als Startbereich bezeichnet, der Bereich mit dem rechten Rand als Endbereich. Für jeden dieser Bereiche gibt es ein entsprechendes FO-Element, das bestimmte Markup-Anweisungen aufnimmt.

Der Kopfzeilen-Bereich wird auch als fo:region-before bezeichnet, weil er vor dem Rumpf erscheint, wenn man sich das Layout sequentiell vorstellt. Der linke Randbereich wird als fo:region-start bezeichnet; der Rumpf ist fo:region-body; der rechte Rand ist fo:region-end, und die Fußzeile fo:region-after. Abbildung 15.3 zeigt die relativen Positionen dieser Bereiche auf einer Seite.

Abbildung 15.3:  Formatierungsbereiche auf einer Seite für Sprachen, die von links nach rechts gelesen werden, wie beispielsweise Deutsch

Diese Ausrichtung ist spezifisch für Sprachen, die auf einer Seite von rechts nach links angeordnet und gelesen werden, beispielsweise Deutsch. Werden dagegen arabische und hebräische Seiten mit Formatting Objects angelegt, muss sich der fo:region-start auf der Seite rechts befinden, fo:region-end auf der Seite links.

Jeder dieser Bereiche kann Stilauszeichnungen enthalten, die als FO-Eigenschaften kodiert sind. Wenn Sie beispielsweise wollen, dass der Text in der Kopfzeile einen linken Rand von zwei Zoll erhalten soll, setzen Sie das entsprechende Attribut für das fo:region- before-Element. In diesem Fall wird das Element wie folgt aussehen:

<fo:region-before -element margin-left="2in"/>

Angenommen, Sie wollen den Rumpf einer Ausgabeseite, die Sie gerade mit XSL-FO anlegen, 1,5 Zoll vom linken Rand und 1 Zoll von oben anordnen, wie in der in Abbildung 15.2 dargestellten Seiteneinrichtung für ein Word-Dokument gezeigt. Vorausgesetzt, der erste Seiten-Master heißt Nachrichtenseite, wird das vollständige fo:layout-master-set- Element so aussehen:

 <fo:layout-master-set>
<fo:simple-page-master master-name="Nachrichtenseite">
<fo:region-body margin-left="1.5in" margin-top="1in"/>
</fo:simple-page-master>
</fo:layout-master-set>

Sie sehen, dass das fo:layout-master-set-Element ein untergeordnetes fo:simple-page- master-Element mit dem master-name Nachrichtenseite enthält. Das fo:simple-page- master-Element enthält ein fo:region-body-Element mit Attributen für die Seitenränder.

In XSL-FO werden die Seiten eines Dokuments in Folgen gruppiert, wobei jede Folge mit einer neuen Seite beginnt. Folgen sollen explizit definieren, wie die Seiten präsentiert werden. Beispielsweise können Sie den Prozessor anweisen, ein bestimmtes Layout solange wie nötig zu wiederholen, bis der gesamte Inhalt verarbeitet ist. Dazu geben Sie ein fo:repeatable-page-master-reference-Element mit einem entsprechenden master-name- Attribut an, dessen Wert derselbe ist wie beim benannten simple-page-master, der für den gesamten Inhalt wiederholt werden soll. Für die erste Übung ist das nicht erforderlich, aber für komplexere Formatierungsobjekte kann diese Technik ganz praktisch sein. Im ersten XSL-FO-Dokument verwenden Sie ein fo:page-sequence-Element, um den Textinhalt aufzunehmen. Es sieht wie folgt aus:

 <fo:page-sequence master-name="Nachrichtenseite">
weiterer Elementinhalt
</fo:page-sequence>

Der weitere Elementinhalt, der im fo:page-sequence-Element enthalten ist, beinhaltet ein fo:flow-Containerelement. Dabei handelt es sich um ein spezielles Containerelement für den gesamten Benutzertext im Dokument. Alles im fo:flow-Element Enthaltene wird auf den Seiten in Bereichen formatiert, die innerhalb der Seitenfolge erzeugt werden. In Ihrem Dokument kodieren Sie das flow-name-Attribut mit dem Wert Nachrichtenseite, um den Fluss mit einem bestimmten Bereich auf der Seite zu verbinden. Insbesondere erscheint der Text im Rumpf, weil dies der Bereich ist, auf den verwiesen wird. Sie wissen, dass auf den Rumpf verwiesen wird, weil das fo:region-body-Element im fo:simple-page- master enthalten ist, das den master-name "Nachrichtenseite" beinhaltet. Die Elementnamen erscheinen Ihnen jetzt vielleicht noch verwirrend, aber Sie haben bereits alle Komponentenelemente und Attribute, um Ihr erstes XSL-FO-Dokument zu erstellen. Werden sie alle kombiniert, erhalten Sie ein Dokument wie das in Listing 15.1 gezeigte. Geben Sie dieses Listing ein und speichern Sie es unter dem Namen nachricht01.fo.

Listing 15.1: Ein erstes XSL-FO-Dokument - nachricht01.fo

 1: <?xml version="1.0"?>
2: <!-- Listing 15.1 - nachricht01.fo -->
3:
4: <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
5:
6: <fo:layout-master-set>
7: <fo:simple-page-master master-name="Nachrichtenseite">
8: <fo:region-body margin-left="1.5in" margin-top="1in"/>
9: </fo:simple-page-master>
10: </fo:layout-master-set>
11:
12: <fo:page-sequence master-name="Nachrichtenseite">
13: <fo:flow flow-name="xsl-region-body">
14: <fo:block>Meine Nachrichten</fo:block>
15: </fo:flow>
16: </fo:page-sequence>
17:
18: </fo:root>

Zeile 4 enthält das Start-Tag des Wurzelelements (fo:root) mit dem Namensraum (xmlns:fo="http://www.w3.org/1999/XSL/Format"). Die Zeilen 6 bis 10 enthalten das fo:layout-master-set-Element, das die Layoutstruktur für das gesamte Dokument definiert. Das fo:layout-master-set-Element kann beliebig viele simple-page-master-Elemente enthalten; in diesem Fall enthält es nur ein einziges und sein Name ist Nachrichtenseite. Der Rumpf dieses Dokuments wird 1,5 Zoll vom linken Seitenrand und 1 Zoll vom oberen Seitenrand angeordnet (Zeile 8). Die Zeilen 12 bis 16 enthalten das fo:page-sequence-Element sowie seine untergeordneten Elemente, die eine Formatierung für den Bereich enthalten, der dem simple-page-master desselben master-name (Nachrichtenseite) entspricht. Das fo:flow-Element (Zeilen 13 bis 15) enthält den Text, der in einem Block auf der Seite platziert werden soll.

Nachdem Sie das Dokument nachricht01.fo eingegeben und gespeichert haben, verarbeiten Sie es mit FOP. Um eine PDF-Datei zu erzeugen, geben Sie die Befehlszeilenanweisung für Ihre FOP-Version ein, z.B.:

fop -fo laufwerk:\pfad\nachricht01.fo -pdf laufwerk:\pfad\nachricht01.pdf

Um die Ergebnisse statt dessen auf dem Bildschirm anzuzeigen, geben Sie Folgendes ein (bzw. den äquivalenten Befehl für Ihre FOP-Version):

fop -fo laufwerk:\pfad \nachricht01.fo -awt

Wenn Sie Abbildung 15.4 genauer betrachten, erkennen Sie, dass sie beide Ausgabeformen zeigt. Im Hintergrund sehen Sie die von FOP erzeugte PDF-Datei, wie sie in Adobe Acrobat angezeigt wird. Der Vordergrund zeigt die resultierende Seite in dem in FOP eingebauten Java-Viewer.

Abbildung 15.4:  Zwei Ansichten der durch die Verarbeitung eines XSL-FO-Dokuments erzeugten Ergebnisse

Schrift-Attribute

Die restliche Formatierung, die Sie möglicherweise vornehmen wollen, hat größtenteils mit der Kombination von Stil-Attributen und Werten mit den betreffenden Elementen zu tun. Sie kennen jetzt die grundlegende Struktur eines XSL-FO-Dokuments. Diese Struktur bleibt grundsätzlich immer dieselbe, egal wie komplex das Dokument wird. Durch das Hinzufügen neuer Seiten-Master, Folgen und Abläufe können Sie alle Bereiche beliebiger Seiten erstellen und interessante Stileffekte erzielen. Auf diese Weise ist XSL-FO vergleichbar mit CSS. Viele der Eigenschaften der Ansätze können einander direkt zugeordnet werden. Das W3C wollte, dass XSL auf der Arbeit aufsetzt, die für die Bereitstellung von CSS bereits erledigt wurde.

Im nächsten Beispiel fügen Sie eine Nachricht ein, die den Namen des Senders sowie den Nachrichtentext enthält. Darüber hinaus werden Sie ein paar Text- und Schrift-Attribute einführen, um die Ausgabe interessanter zu machen. Zunächst verschieben Sie die Seitenüberschrift Meine Nachrichten in die Mitte der Seite, indem Sie für das fo:block- Element, das den Text enthält, das Attribut text-align="center" setzen. Damit sieht es folgendermaßen aus:

   <fo:block
text-align="center"> Meine Nachrichten</fo:block>

Jetzt fügen Sie geeignete Attribute hinzu, die den Text mit einer Größe von 28 Punkt und mit einer serifenlosen, fetten, blauen Schrift anzeigen. Ihr fo:block-Element sieht jetzt so aus:

<fo:block
text-align="center"
font-size="28pt"
font-family="sans-serif"
font-weight="bold"
color="blue">Meine Nachrichten
</fo:block>

Fügen Sie zwei weitere fo:block-Elemente in denselben xsl-region-body der Seite ein, die den folgenden Textinhalt haben:

Von: Kathy Shepherd
Nachricht: Denke daran, auf dem Nachhauseweg von der Arbeit Milch zu kaufen

Machen Sie den Text 12 Punkt groß, verwenden Sie eine serifenlose Schrift und speichern Sie das Ergebnis unter nachricht02.fo. Sehen die von Ihnen eingefügten Blöcke so aus?

<fo:block
font-size="12pt"
font-family="sans-serif">Von: Kathy Shepherd
</fo:block>

<fo:block
font-size="12pt"
font-family="sans-serif">Nachricht:
Denke daran, auf dem Nachhauseweg von der Arbeit Milch zu kaufen
</fo:block>

Nachdem Sie diese Ergänzungen vorgenommen und das Dokument gespeichert haben, verarbeiten Sie es mit FOP und zeigen die Ergebnisse an. Erhalten Sie genau das, was Sie erwartet haben? Betrachten Sie die Überschrift. Befindet sie sich wirklich in der Seitenmitte oder ist sie doch zu weit rechts? Es gibt eine Möglichkeit, wie Sie sicherstellen können, dass die Überschrift wirklich mittig angezeigt wird: Ändern Sie das fo:region- body-Element so ab, dass es ein margin-right-Attribut enthält, das gleich dem margin-left- Attribut ist. Dazu schreiben Sie den folgenden Code:

<fo:region-body margin-left="1.5in" 
margin-right="1.5in" margin-top="1in"/>

Der fertige Code sieht aus wie in Listing 15.2 gezeigt.

Listing 15.2: Ein XSL-FO-Beispiel mit Schrift-Attributen - nachricht02.fo

 1: <?xml version="1.0"?>
2: <!-- Listing 15.2 - nachricht02.fo -->
3:
4: <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
5:
6: <fo:layout-master-set>
7: <fo:simple-page-master master-name="Nachrichtenseite">
8: <fo:region-body margin-left="1.5in"
9: margin-right="1.5in" margin-top="1in"/>
10: </fo:simple-page-master>
11: </fo:layout-master-set>
12:
13: <fo:page-sequence master-name="Nachrichtenseite">
14: <fo:flow flow-name="xsl-region-body">
15:
16: <fo:block
17: text-align="center"
18: font-size="28pt"
19: font-family="sans-serif"
20: font-weight="bold"
21: color="blue">Meine Nachrichten
22: </fo:block>
23:
24: <fo:block
25: font-size="12pt"
26: font-family="sans-serif">Von: Kathy Shepherd
27: </fo:block>
28:
29: <fo:block
30: font-size="12pt"
31: font-family="sans-serif">Nachricht:
32: Denke daran, auf dem Nachhauseweg von der Arbeit Milch zu kaufen
33: </fo:block>
34:
35: </fo:flow>
36: </fo:page-sequence>
37:
38: </fo:root>

Die beiden neuen Blöcke beginnen in den Zeilen 24 und 29. Jeder davon enthält ein font-size- und ein font-family-Attribut. Die Zeile 9 enthält das Attribut margin-right="1.5in", das hinzugefügt wurde, um sicherzustellen, dass der region-body auf der Seite und der Textblock Meine Nachrichten im Rumpfbereich zentriert ist. Abbildung 15.5 zeigt das Ergebnis.

Abbildung 15.5:  XSL-FO-Schriftstile

Inline-Stile

Wenn Sie den Stil des Textstring-Fragments Von: ändern wollen, damit es sich von dem nächsten Teil des Strings, Kathy Shepherd, unterscheidet, können Sie es in einen neuen Block einpacken. Wenn Sie das tun, werden die beiden Stringfragmente jedoch auch durch einen Zeilenumbruch voneinander getrennt. XSL-FO stellt eine einfache Möglichkeit dar, mithilfe verschachtelter Elemente Inline-Stile zu kodieren. Das fo:inline-Element kann um ein innerhalb eines Strings liegendes Stringfragment herumgelegt werden, das einen anderen Stil als der restliche String erhalten soll. Legen Sie ein fo:inline-Element um die Von:- und Nachricht:-Abschnitte der Strings in Ihrem Dokument herum. Gewichten Sie den Text fett und zeichnen Sie ihn kursiv aus. Das Markup für den Von:-String soll wie folgt aussehen:

     <fo:inline font-weight="bold"
font-style="italic" >Von: </fo:inline>

Nehmen Sie die erforderlichen Änderungen an Ihrem Dokument vor und speichern Sie sie unter dem Namen nachricht03.fo. Abbildung 15.6 zeigt das Ergebnis dieser Änderungen.

Abbildung 15.6:  XSL-FO-Inline-Stile

XSL-FO-Tabellen

Tabellen in XSL-FO bestehen aus Zellen in Zeilen. Jetzt werden Sie den Nachrichtentext so abändern, dass er in einer Tabelle abgelegt wird, die sich aus zwei Spalten und zwei Zeilen zusammensetzt. Die grundlegende Syntax für eine Tabelle sieht folgendermaßen aus:

<fo:table>

<fo:table-column column-width="wert" />
<fo:table-column column-width="wert" />
...beliebige weitere Spalten

<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block>
Zellendaten
</fo:block>
</fo:table-cell>
...beliebige weitere Zellen

</fo:table-row>
...beliebige weitere Zeilen

</fo:table-body>
</fo:table>

Die Spezifikation fordert, dass Sie die Zeilen definieren und für jede Spalte in der Tabelle ein fo:table-column-Element mit einem column-width-Attribut anbieten. Für diese Übung soll die linke Spalte 1 Zoll breit sein, die rechte Spalte 4,5 Zoll.

<fo:table-column column-width="1in" />
<fo:table-column column-width="4.5in"/>

Den Zellen wird ein Abstand (Padding) von 0,05 Zoll (padding=".05in") hinzugefügt, sodass die Kanten der Zellen den Tabellenrahmen nicht berühren. Damit das Ganze interessanter aussieht, fügen wir eine Hintergrundfarbe mit dem Wert aqua für die Blöcke mit Von: und Nachricht: ein. Der Code für die erste Zelle kann wie folgt aussehen:

<fo:table-cell padding=".05in">
<fo:block background-color="aqua">
Von:
</fo:block>
</fo:table-cell>

Wie immer sollten alle speziellen Stil-Attribut/Wert-Paare, die angewendet werden - beispielsweise für Farben, Zellen- oder Tabellenrahmen, Hintergrundfarben usw. - als Attribute auf die Elemente angewendet werden, die sie direkt ändern. Das vollständige Dokument sehen Sie in Listing 15.3. Speichern Sie es als nachricht04.fo. Ihr Dokument enthält möglicherweise keine Kommentare - sie wurden eingefügt, um zu verdeutlichen, wo die einzelnen Zellen kodiert werden.

Listing 15.3: Tabellenkodierung mit XSL-FO - nachricht04.fo

 1: <?xml version="1.0"?>
2: <!-- Listing 15.3 - nachricht04.fo -->
3:
4: <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
5:
6: <fo:layout-master-set>
7: <fo:simple-page-master master-name="Nachrichtenseite">
8: <fo:region-body margin-left="1.5in"
9: margin-right="1.5in" margin-top="1in"/>
10: </fo:simple-page-master>
11: </fo:layout-master-set>
12:
13: <fo:page-sequence master-name="Nachrichtenseite">
14: <fo:flow flow-name="xsl-region-body">
15:
16: <fo:block
17: text-align="center"
18: font-size="28pt"
19: font-family="sans-serif"
20: font-weight="bold"
21: color="blue">Meine Nachrichten
22: </fo:block>
23:
24: <fo:table border-style="solid">
25:
26: <!-- Spaltenbreite muss angegeben werden -->
27: <fo:table-column column-width="1in" />
28: <fo:table-column column-width="4.5in"/>
29:
30: <fo:table-body>
31:
32: <!-- erste Zeile der Tabelle -->
33: <fo:table-row>
34:
35: <!-- Zelle oben links -->
36: <fo:table-cell padding=".05in">
37: <fo:block background-color="aqua">
38: Von:#
39: </fo:block>
40: </fo:table-cell>
41:
42:
43: <!-- Zelle oben rechts -->
44: <fo:table-cell padding=".05in">
45: <fo:block>
46: Kathy Shepherd
47: </fo:block>
48: </fo:table-cell>
49: </fo:table-row>
50:
51: <!-- zweite Zeile der Tabelle -->
52: <fo:table-row>
53:
54: <!-- Zelle unten links -->
55: <fo:table-cell padding=".05in">'
56: <fo:block background-color="aqua">
57: Nachricht:
58: </fo:block>
59: </fo:table-cell>
60:
61:
62: <!-- Zelle unten rechts -->
63: <fo:table-cell padding=".05in">
64: <fo:block>
65: Denke daran, auf dem Nachhauseweg von der Arbeit Milch zu kaufen
66: </fo:block>
67: </fo:table-cell>
68:
69: </fo:table-row>
70:
71: </fo:table-body>#
72: </fo:table>
73:
74: </fo:flow>
75: </fo:page-sequence>
76:
77: </fo:root>

Die Zeilen 1 bis 22 wurden unverändert aus dem vorherigen Beispiel übernommen. Die Tabelle beginnt in Zeile 24 und beinhaltet ein border-style-Attribut, das einen durchgängigen Rahmen um die gesamte Tabelle zieht. Die Spaltenbreiten für die linke und die rechte Spalte werden in den Zeilen 27 bzw. 28 gesetzt. In Zeile 33 beginnt die erste Zeile der Tabelle. Die Elemente, die zu der Zeile gehören, sind in den Zeilen 34 bis 48 angegeben. Die obere linke Zelle der Tabelle ist in den Zeilen 36-40 kodiert. Jede Zelle beinhaltet 0,05 Zoll Abstand zwischen der Zellengrenze und den Grenzen anderer Zellen oder dem Tabellenrahmen. Nur die Zellen in der linken Spalte haben die Hintergrundfarbe aqua (Zeilen 37 und 56). Die Zellkodierung wird für die drei restlichen Zellen wiederholt (die in den Zeilen 44, 55 bzw. 63 beginnen). In den Zeilen 69 bis 77 werden alle geöffneten Elemente geschlossen.

15.3 Zusammenfassung

Heute haben Sie einfache XSL-FO-Objekte (Extensible Stylesheet Language Formatting Objects) erzeugt und verwendet, um XML einen Stil für die Ausgabe auf einem Bildschirm eines angepassten Kunden zuzuordnen. Außerdem haben Sie gelernt, PDF- Dateien für die gedruckte und elektronische Weitergabe zu erzeugen. Sie haben Ihren Code durch einen Open Source Java FO-Interpreter von Apache, FOP, geschickt. Dieser kostenlose Prozessor kann auf mehreren verschiedenen Plattformen ausgeführt und in benutzerdefinierte Java-Applikationen integriert werden. Sie haben erfahren, dass XSL Formatting Objects eine Untermenge der XSL-Empfehlung sind. XSL Transformations (XSLT), die unabhängig von XSL-FO ausgeführt werden können, bilden den anderen Teil der XSL-Spezifikation. Im nächsten Kapitel lernen Sie XSLT kennen und werden es verwenden, um die Struktur von XML-Dokumenten umzuwandeln.

15.4 Fragen und Antworten

Frage:
Welche Beziehung besteht zwischen XSL, XSL-FO und XSLT?

Antwort:
Die W3C Extensible Stylesheet Language-Empfehlung besteht aus einem Transformationsteil (XSLT) und einer Sprache zur Beschreibung von Formatierungsobjekten (XSL-FO). XSLT, das die Struktur eines XML-Dokuments in eine neue Markup-Struktur umwandeln kann, kann unabhängig von XSL-FO eingesetzt werden. XSLT kann ein XML-Dokument in ein anderes XML- Dokument oder in ein HTML-Dokument umwandeln oder für diesen Zweck auch in jede beliebige andere Form von Textdokument. XSL-FO ist ideal zur Verwendung bei Druckmedien oder verschiedenen anderen Benutzer-Agenten.

Frage:
Wo befindet sich die XML-Quelldatei in einer XSL-FO-Operation? Wie erhalten Sie beispielsweise eine PDF-Datei aus einem XML-Dokument?

Antwort:
Das XSL-FO-Dokument ist ein XML-Instanzdokument, aber das ist nur ein einziges Dokument in einer Operation, die normalerweise aus mehreren Schritten besteht. Um von einem Original-XML-Quelldokument zu einer PDF-Ausgabe zu gelangen, muss dieses Dokument von dem XML-Quellbaum-Dialekt, in dem es geschrieben wurde, in ein XSL-FO-Dokument umgewandelt werden. Dazu ordnen Sie einem XML-Quelldokument ein XSL-Stylesheet-Dokument für die Umwandlung durch einen XSLT-Prozessor zu. Diese Zuordnung erzeugt ein XSL-FO-Ergebnisbaum-Dokument. Das XSL-FO-Ergebnisbaum-Dokument wird dann durch einen Interpreter geschickt, der das XSL-FO in ein Ausgabedokument in einem anderen Vokabular übersetzt, beispielsweise PDF.

Frage:
Wie kann FOP als eingebetteter Prozess innerhalb einer Applikation verwendet werden, um Ausgaben von Formatting Objects zu erzeugen?

Antwort:
Der FOP-Prozessor kann in eine Java-Applikation eingebettet werden, indem der org.apache.fop.apps.Driver instanziert wird, den Sie auf der FOP-Website finden. Eine ausführliche Dokumentation finden Sie unter http:// xml.apache.org/fop/. Unter Verwendung der auf derselben Site beschriebenen Prozeduren können Sie den FOP-Prozessor auch in den Apache Xerces SAX- Parser integrieren. Sie finden den Apache Xerces SAX-Parser unter http:// xml.apache.org/ in Versionen für Java, C++ und Perl. Auf diese Weise können Sie FOP-Ergebnisse erzeugen, indem Sie SAX-Ereignisse auslösen, um FO-Ausgaben herzustellen.

Frage:
Können auch Bilder in Formatting Objects-Ausgaben eingebunden werden?

Antwort:
Externe Grafikdateien können einem XSL-FO-Dokument mit dem fo:external- graphic-Element und mit einem src-Attribut mit URI-Wert zugeordnet werden. Mithilfe des fo:external-graphic-Elements bettet der Prozessor die Grafik in die Ausgabe ein. Die Syntax für das fo:external-graphic-Element sieht folgendermaßen aus:

      <fo:external-graphic src="URI"/>

15.5 Übung

Legen Sie mithilfe der Tabelle der unterstützten Formatierungsobjekte und der Daten aus Ihrem cd.xml-Dokument eine markierte Liste mit CD-Titeln an.



vorheriges KapitelInhaltsverzeichnisStichwortverzeichnisFeedbackKapitelanfangnächstes Kapitel


© Markt+Technik Verlag, ein Imprint der Pearson Education Deutschland GmbH