XML mit Java OpenSource (c) Mark Egloff 2004 FOP << Apache‘s FOP >> 1 XML mit Java OpenSource (c) Mark Egloff 2004 FOP Was ist FOP ? FOP = Formatting Object Processor Ein FOP Prozessor setzt die XML FO Dateien gemäss den Anweisungen in das jeweilige binäre Format um Apache besitzt eine Opensource Implementation eines solchen FO Prozessors http://xml.apache.org/fop Er lässt sich via Command Line sowie direkt im Java Code verwenden. 2 XML mit Java OpenSource (c) Mark Egloff 2004 FOP Installation von Apache‘s FOP Apache‘s FOP benötigt zusätzlich andere Java Libraries. Die notwendigsten sind jedoch in der Distribution enthalten 3 Diese externen Libraries müssen im CLASSPATH vorhanden sein. Î Falls Java 1.3 muss Xalan eingebunden werden Î Bei Java 1.4 endorsed Mechanism beachten XML mit Java OpenSource (c) Mark Egloff 2004 FOP FOP ausführen per Commandline Apache‘s FOP bietet zur Ausführung eine „main“ Applikation an: org.apache.fop.apps.Fop z.B.: wichtigste Parameter Beschreibung -XML file.xml -XSL file.xsl input XML u. XSL falls zuerst eine XSLT durchgeführt werden soll um ein XML FO zu erstellen -fo input XML FO, falls keine XSLT durchgeführt soll file.fo -pdf -pcl -ps -svg 4 C:\> java -Djava.endorsed.dirs=lib\endorsed –cp lib\fop.jar;lib\batik.jar;... org.apache.fop.apps.Fop -fo hello.fo -pdf hello.pdf -c config.xml -awt -at output filename für das jeweilige Format. Nur eine Ausgabe gleichzeitig möglich. optionales Config File um z.B. Fonts einzubetten XML mit Java OpenSource (c) Mark Egloff 2004 FOP FOP ausführen per Commandline z.B.: PDF anhand einer XML-FO Datei erzeugen <xml> <xml> FO FO FOP PDF PDF C:\> java –cp lib\fop.jar;lib\batik.jar;... org.apache.fop.apps.Fop -fo hello.fo -pdf hello.pdf 5 Parameter Beschreibung -fo file.fo input XML FO, fertiges XML mit FO Elementen -pdf file.pdf Ausgabe File als PDF XML mit Java OpenSource (c) Mark Egloff 2004 FOP FOP ausführen per Commandline z.B.: zuerst XSL Transformation, dann PDF Generierung <xml> <xml> hello hello XSLT Processor FOP PDF PDF <xsl> <xsl> FO FO C:\> java –cp lib\fop.jar;lib\batik.jar;... org.apache.fop.apps.Fop -xml hello.xml –xsl hello.fo.xsl -pdf hello.pdf 6 Parameter Beschreibung -XML file.xml -XSL file.xsl input XML u. XSL falls zuerst eine XSLT durchgeführt werden soll um ein XML FO zu erstellen -pdf file.pdf Ausgabe File als PDF XML mit Java OpenSource (c) Mark Egloff 2004 FOP FOP in Java Programm einbetten (1/2) FOP bietet ein einfaches Java API um direkt PDF aus dem Programm zu erzeugen import org.apache.fop.apps.*; import java.io.*; <xml> <xml> FO FO FOP PDF PDF public class ExampleFOPRun { public static void main(String[] args) { try { // create new FOP Driver driver = new Driver(); //Setup logging here if needed: driver.setLogger(... //read fop config file if needed Æ static pattern inside new Options(new File("myFOPconfig.xml")); 7 ... XML mit Java OpenSource (c) Mark Egloff 2004 FOP FOP in Java Programm einbetten (2/2) //set Outputformat driver.setRenderer(Driver.RENDER_PDF); // set Input for reading XML FO data driver.setInputSource("hello.fo"); // set Output File driver.setOutputStream("hello.pdf"); // Execute FOP driver.run(); } catch( Exception ex) { ... } } } 8 XML mit Java OpenSource (c) Mark Egloff 2004 FOP FOP in Java Programm einbetten mit XSLT (1/2) import import import import import java.io.*; javax.xml.transform.*; <xml> <xml> javax.xml.transform.stream.*; javax.xml.transform.sax.*; org.apache.fop.apps.*; public class ExampleXML2PDFRun { public static void main(String[] args) { try { // create new FOP Driver driver = new Driver(); FOP PDF PDF <xsl> <xsl> FO FO //Setup logging here if needed: driver.setLogger(... //read fop config file if needed Æ static pattern inside new Options(new File("myFOPconfig.xml")); ... 9 XML mit Java OpenSource (c) Mark Egloff 2004 FOP FOP in Java Programm einbetten mit XSLT (2/2) //Set Outputformat and Output File driver.setRenderer(Driver.RENDER_PDF); driver.setOutputStream(new FileOutputStream("hello.pdf")); //Setup XSLT TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer( new StreamSource(new File("hello.xsl"))); //Setup input for XSLT transformation Source src = new StreamSource(new File("hello.xml")); //Resulting SAX events must be piped through to FOP Result res = new SAXResult(driver.getContentHandler()); //Start XSLT transformation and FOP processing transformer.transform(src, res); } catch( Exception ex){ ... } 10 }} XML mit Java OpenSource (c) Mark Egloff 2004 XSL- FO Links 11 z W3C XSL-FO: http://www.w3.org/TR/xsl/slice6.html#fo-section z W3C CSS 2 http://www.w3.org/TR/REC-CSS2 z XSL FO Reference http://www.zvon.org/xxl/xslfoReference/Output/ z Apache FOP: http://xml.apache.org/fop/index.html XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO << Einführung in XSL-FO >> 1 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO Übersicht / Lernziele: 2 z Was ist XSL-FO ? z Was ist ein Format Prozessor ? z Anwendungen mit XSL-FO realisieren z Syntax und Funktionsweise von XSL-FO z XSL-FO Transformation mit FOP und Xalan z Apache FOP API kennen z Aus XSL-FO PDF erstellen XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO Was ist XSL-FO ? FO = Formatting Objects Mittels XSL-FO ist eine Sprache um XML Daten für Präsentationsmedien zu formatieren. XSL-FO ist ein Standard, es wurde in die XSL W3C Spezifikation aufgenommen. Die Formatierungen sind nach dem CSS 2 W3C Standard spezifiziert 3 XSL-FO wird verwendet um die Präsentation von Daten mittels XML zu beschreiben. Diese können später mittels einem Prozessor in binäre Präsentations Formate wie PDF, Postscript etc. überführt werden. XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO Prinzip von XSL-FO App <xml> <xml> <xsl> <xsl> FO FO XSLT Processor <xml> <xml> FO FO FOP Serializer SVG SVG RTF RTF TXT XML TXT XML PDF PDF PCL PCL MTF MTF Post Post Script Script Ein XSLT Prozessor transformiert eingehende XML Daten in das XML – FO Textformat. Ein Formatting Prozessor (FOP) erstellt daraus eine binäre Datei z.B. PDF, RTF, SVG, PS etc. 4 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO Was ist XSL-FO ? Mittels XSL-FO können wir bekannte Formatierungen anwenden • Listen • Tabellen • Hyperlinks • Kopf- u- Fusszeilen • Fussnoten • Seitenformate • Seitennummerierungen • unterschiedliche Schreibrichtungen •… 5 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO Beispiel XML-FO und FOP: 6 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="only" page-width="5.5cm" margin-left="1cm"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="only"> <fo:flow flow-name="xsl-region-body"> <fo:block font-size="18pt"> A small <fo:external-graphic src="file:fo.jpg"/> example </fo:block> </fo:flow> </fo:page-sequence> </fo:root> XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO Beispiel XML-FO und FOP: <xml> <xml> FO FO 7 FOP Serializer PDF PDF XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax Übersicht XSL-FO Syntax Der XSL-FO Synatx ist eine sehr umfangreich. Besitzt viele Formatierungs-Möglichkeiten Der Syntax besteht aus 56 vordefinierten XML Elementen Die Detailformatierungen werden mit Attributen vorgenommen. Es gibt hierbei 246 vordefinierte Eigenschaften, wobei jedes XML FO Element seine spezifischen Attribute besitzen kann z.B.: 8 <fo:block font-size="24pt" text-align="center"> Ein erster Text </fo:block> XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax XSL-FO Elemente fo:basic-link, fo:bidi-override, fo:block, fo:block-container, fo:character, fo:color-profile, fo:conditional-page-master-reference, fo:declarations, fo:external-graphic, fo:float, fo:flow, fo:footnote, fo:footnote-body, fo:initial-property-set, fo:inline, fo:inline-container, fo:instream-foreign-object, fo:layout-master-set, fo:leader, fo:listblock, fo:list-item, fo:list-item-body, fo:list-item-label, fo:marker, fo:multi-case, fo:multi-properties, fo:multi-property-set, fo:multiswitch, fo:multi-toggle, fo:page-number, fo:page-number-citation, fo:page-sequence, fo:page-sequence-master, fo:region-after, fo:region-before, fo:region-body, fo:region-end, fo:region-start, fo:repeatable-page-master-alternatives, fo:repeatable-page-masterreference, fo:retrieve-marker, fo:root, fo:simple-page-master, fo:single-page-master-reference, fo:static-content, fo:table, … 9 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Aufbau Übersicht, Aufbau einer XSL-FO Datei: XSL-FO Root Layouts <fo:root> <fo:layout-master-set> Layout A <fo:simple-page-master/> Layout B <fo:simple-page-master/> </fo:layout-master-set> PageSequence A Content <fo:page-sequence> <fo:flow/> </fo:page-sequence Page Sequence B <fo:page-sequence/> </fo:root> 10 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Aufbau Übersicht, Aufbau einer XSL-FO Datei: fo:root fo:layout-master-set fo:simple-page-master fo:declarations fo:color-profile fo:page-sequence fo:title fo:flow fo:static-content fo:region-body fo:region-before fo:page-sequence-master fo:region-start fo:region-end fo:region-after 11 fo:single-pagemaster-reference fo:repeatablepage-masterreference fo:repeatablepage-masteralternatives fo:conditional-pagemaster-reference XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:root> : XSL-FO Root Element Jedes XSL-FO Dokument beginnt mit dem „<fo:root>“ Element Der Namespace „fo“ ist fest vorgegeben. <?xmlversion="1.0"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> ... </fo:root> 12 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:layout-master-set> : Einleitung Layout Definitionen Mittels „<fo:layout-master-set“> leiten wir die Layout Definitionen für Seiten ein. Dieses Element beinhalte alle einzelnen Layout Definitionen die mittels separaten Elementen beschrieben werden. <?xmlversion="1.0"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> ... </fo:layout-master-set> </fo:root> 13 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:simple-page-master> : Seitenaufteilung und Layout Mittels dem Element „<fo:simple-page-master>“ legen wir die Seitengrösse , Seitenränder sowie spätere Unterregionen fest. <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="first" page-height="297mm" page-width="210mm" margin-top="15mm" margin-bottom="15mm" margin-left="20mm" margin-right="15mm"/> </fo:layout-master-set> </fo:root> 14 Jedes „<fo:simple-page-master>“ Element besitzt einen eindeutigen Namen um es später einer „Page-Sequence“ zuzuordnen XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:region-xxxx> : Seitenaufteilung Eine Seite ist aufgeteilt in fünf Regionen: region-before, region-after, region-start, region-end region-body 15 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:region-xxxx> : Beispiel Bereiche definieren Region-Before Region-Body Region-After 16 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:region-xxxx> : Beispiel Bereiche definieren <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="first" page-height="100mm" page-width="90mm" margin-top="15mm" margin-bottom="15mm" margin-left="10mm" margin-right="10mm"> <fo:region-before extent="10mm"/> <fo:region-body margin-top="20mm" margin-bottom="15mm" /> <fo:region-after extent="10mm"/> </fo:simple-page-master> </fo:layout-master-set> ... </fo:root> 17 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:page-sequence>: Seiten-Instanzen Mittels dem Element „<fo:page-sequence>“ beginnen wir den Dokumentinhalt und verweisen auf ein zuvor definiertes Layout. <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="first".../> </fo:layout-master-set> <fo:page-sequence master-reference="first"> ... </fo:page-sequence> </fo:root> 18 „<fo:page-sequence>“ muss immer nach „<fo:layout-master-set>“ aufgelistet werden XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:page-sequence>: Seiten-Instanzen Es besteht die Möglichkeit mehrere Seitenlayout zu definieren und für unterschiedliche Seiten zu verwenden 19 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="front".../> <fo:simple-page-master master-name="rest".../> </fo:layout-master-set> <fo:page-sequence master-reference="front"> ... </fo:page-sequence> <fo:page-sequence master-reference="rest"> ... </fo:page-sequence> </fo:root> XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:static-content>, <fo:flow>: Regionen festlegen Mittels den Elementen „<fo:static-content>“ und „<fo:flow>“ werden Inhaltsbereiche festgelegt um Content aufzunehmen Diese Inhaltsbereiche verweisen auf ein zuvor definierte Regionen im Layout-Set „<fo:static-content>“ muss für die zuvor definierten Regionen „before“ „after“ „start“ oder „end“ verwendet werden. Der Name ist dabei auf „xsl-region-xxxx“ vorgegeben 20 „<fo:flow>“ kann nur auf die Region „body“ verweisen. Der Name ist dabei auf „xsl-regionbody“ vorgegeben XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:region-xxxx> :Beispiel Bereiche anwenden 21 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> ... <fo:page-sequence master-reference="first"> <fo:static-content flow-name="xsl-region-before"> <fo:block>region-before</fo:block> </fo:static-content> <fo:static-content flow-name="xsl-region-after"> <fo:block>region-after</fo:block> </fo:static-content> <fo:flow flow-name="xsl-region-body"> <fo:block> region-body </fo:block> </fo:flow> </fo:page-sequence> </fo:root> XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:static-content>, <fo:flow>: Regionen festlegen Unterschied static ÅÆ dynamic „<fo:static-content>“ ist nur für statischen Inhalt gedacht. Das heisst er ist für alle Seiten der Page-sequence immer gleich. Verwendung wäre für Header und Footer. „<fo:flow>“ ist nur für dynamische Inhalte gedacht. Passt der Inhalt nicht auf eine Seite so wird es auf der nächsten Seite fortgesetzt. Hier wird also der eigentliche Content eingebettet. 22 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:block>: Textbereich festlegen Mittels dem Element „<fo:block>“ legen wir einen Textbereich fest. Text kann nur mit diesem Element platziert werden. z.B.: <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> ... <fo:page-sequence master-reference="first"> <fo:flow flow-name="xsl-region-body"> <fo:block>Hello World!</fo:block> </fo:flow> </fo:page-sequence> </fo:root> 23 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:block>: Textbereich festlegen Innerhalb „<fo:block>“ passieren die Zeilenumbrüche automatisch Î Fliesstext Um einen Zeilenumbruch zu erzwingen muss ein neues Element „<fo:block>“ verwendet werden z.B.: <fo:block> Ende einer Zeile... </fo:block> <fo:block> neue Zeile... </fo:block> 24 <fo:block> Ende einer Zeile... <fo:block> neue Zeile... </fo:block> </fo:block> XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:block> : Textformatierungen festlegen Textformatierungen werden mittels Attributen festgelegt: • font-family • font-style • font-weight • text-decoration • font-size • line-height • color • background-color • text-align z.B.: serif, sans-serif, cursive, fantasy, monospace normal, italic, oblique, backslant, inherit normal, bold, bolder, lighter, inherit underline, overline, line-through <length, absolute-size, relative-size, percentage> <length, absolute-size, relative-size, percentage> red, blue, green, …, rgb(255,0,55), transparent red, blue, green, …, rgb(255,0,55), transparent start, center, end, justify <fo:block font-family="sans-serif" font-size="10pt" > Hello World! 25 </fo:block> XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:block> : Ränder und Abstände festlegen Ränder: • border-color • border-style • border-width red, blue, green, …, rgb(255,0,55), transparent none, hidden, dotted, dashed, solid, double, … <length>, thin, medium, thick Abstände: • margin-top / margin-left / margin-right / margin-bottom <length>, <percentage>, auto z.B.: <fo:block 26 <fo:block border-width="2pt" border-style="solid" border-color="black">...</fo:block> border="2pt solid black">...</fo:block> XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:inline>: Textabschnitt festlegen Das Element „<fo:inline>“ wird innerhalb eines „<fo:block>“ benutzt um einen Textabschnitt zu definieren „<fo:inline>“ wird oft verwendet um eine Formatierung vorzunehmen ohne einen Zeilenumbruch zu verursachen z.B.: 27 <fo:block font-family="TimesRoman"> Hier ist <fo:inline font-style="italic"> ein </fo:inline> Abschnitt <fo:inline font-weight="bold"> mit </fo:inline> verschiedenen <fo:inline color="blue"> Formaten.</fo:inline> </fo:block> XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:block-container>: Textbox festlegen Ein „<fo:block-container>“ Element kann an beliebiger Stelle auf des Seite (absolut) positioniert werden: z.B.: <fo:block-container border-color="black" border-style="solid" border-width="3pt" height="1cm" width="4cm" padding="5pt" top="9.5cm" left="12cm" position="absolute" > <fo:block font-family="sans-serif" font-size="10pt"> Hier ist ein Text </fo:block> </fo:block-container> Hier ist ein Text 28 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:external-graphic>: Bild einbinden Mittels „<fo:external-graphic>“ wird ein Bild eingefügt Mögliche Bildformate sind GIF und JPG, es ist aber am Hersteller des FO Prozessors überlassen Î Apache FOP: BMP,EPS,GIF,JPG,PNG,SVG,TIFF „<fo:external-graphic>“ muss in ein „<fo:block>“ oder „<fo:inline>“ eingebettet werden. z.B.: 29 <fo:block> Look at this! <fo:external-graphic src="cup.jpg"/> </fo:block> XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:leader>: Horizontale Linien Mittels „<fo:leader>“ können horizontale Linien erreicht werden Mittels den Attributen wird die Formatierung der Linie bestimmt: • leader-pattern • leader-length • rule-style • rule-thickness z.B.: 30 space, use-content, rule, dots <length> none, dotted, dashed, solid, double, … <length> <fo:block> <fo:leader leader-pattern="dots" leaderlength="6cm"/> </fo:block> XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:list-block>: Auzählungslisten Mittels „<fo:list-block>“ können Aufzählungslisten realisiert werden. Um Listen zu beschreiben benötigt es noch weitere Sub-Elemente „<fo:list-item>“, „<fo:list-item-label>“, „<fo:list-item-body>“ fo:list-block fo:list-item fo:list-item-label fo:list-item-body 31 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:list-block>: Aufzählungslisten realisieren z.B. <fo:list-block provisional-distance-between-starts="0.5cm"> <fo:list-item> <fo:list-item-label> <fo:block>a)</fo:block> </fo:list-item-label> <fo:list-item-body start-indent="body-start()"> <fo:block> Dies ist das erste Listenelement. </fo:block> </fo:list-item-body> </fo:list-item> ... </fo:list-block> 32 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:footnote>: Fussnote Mittels „<fo:footnote>“ kann eine Fussnote angegeben werden Eine Fussnote besteht aus dem Signet und dem Body. Der Body wird mittels einem Sub-Element „<fo:footnote-body>“ beschrieben. fo:footnote fo:footnote-body 33 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:footnote>: Fussnote anwenden z.B.: <fo:block> Die Fussnote <fo:footnote> <fo:inline font-size="6pt" vertical-align="super">1</fo:inline> <fo:footnote-body> <fo:block font-size="10pt"> <fo:leader leader-pattern="rule" leader-length="6cm"/> 1. Hier ist die Fussnote </fo:block> </fo:footnote-body> </fo:footnote> befindet sich typischerweise... </fo:block> 34 XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:table>: Tabellen definieren Mit dem Element „<fo:table>“ leiten wir eine Tabelle ein. Wie bei HTML besteht auch bei XSL-FO eine Tabelle aus weiteren Subelementen: „<fo:table-body>“, „<fo:table-column>“, „<fo:table-row>“, „<fo:table-cell>“, „<fo:table-header>“, „<fo:table-footer>“ 35 fo:table fo:table-column fo:table-header fo:table-body fo:table-footer fo:table-row fo:table-row fo:table-row fo:table-cell fo:table-cell fo:table-cell XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:table>: Tabellen definieren z.B.: <fo:table border="1pt solid 36 black" background-color="#EEEEEE"> <fo:table-column column-width="20mm"/> <fo:table-column column-width="30mm"/> <fo:table-header font-weight="bold" background-color="#CCCCCC"> <fo:table-row> <fo:table-cell border="1pt solid black"> <fo:block>HTML</fo:block> </fo:table-cell> ... </fo:table-row> </fo:table-header> <fo:table-body> ... </fo:table-body> </fo:table> XML mit Java OpenSource (c) Mark Egloff 2004 XSL-FO - Syntax <fo:table>: Zellen verbinden Tabellenzellen „<fo:table-cell>“ können mit den Attributen „number-columns-spanned“ und „number-rows-spanned“ gruppiert werden 37 <fo:table border="1pt solid black"> <fo:table-column column-width="10mm"/> <fo:table-column column-width="10mm"/> <fo:table-body> <fo:table-row> <fo:table-cell number-columns-spanned="2" border="1pt solid black"> <fo:block>FO</fo:block> </fo:table-cell> </fo:table-row> </fo:table-body> </fo:table> XML mit Java OpenSource (c) Mark Egloff 2004 XSL- FO Links 38 z W3C XSL-FO: http://www.w3.org/TR/xsl/slice6.html#fo-section z W3C CSS 2 http://www.w3.org/TR/REC-CSS2 z XSL FO Reference http://www.zvon.org/xxl/xslfoReference/Output/ z Apache FOP: http://xml.apache.org/fop/index.html