XSL-FO / XSL-FO
![]() |
![]() |
➪ Nachdem Sie die Grundstruktur von Formatting Objects ansatzweise kennen, können Sie zur XSL-Transformation des XML-Dokuments in das Zwischenformat "FO" übergehen; von dort aus übernimmt wieder der FO-Prozessor.
Schreiben Sie sich also ein XSL-Stylesheet, das die Informationen aus dem XML-Input-Dokument via XPath ausliest und deren Werte in das FO-Dokument überträgt.
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">
<fo:root
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master
margin-right="15mm"
margin-left="2cm"
margin-bottom="1cm"
margin-top="2cm"
page-width="21cm"
page-height="297mm"
master-name="layout1">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence
master-reference="layout1">
<fo:flow
flow-name="xsl-region-body">
<xsl:for-each
select="/Orte/Ort/Mensch">
<fo:block>
<xsl:value-of select="vorname"/>
<xsl:text> </xsl:text>
<xsl:value-of select="name"/>
</fo:block>
</xsl:for-each>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
Das Interessante an dem vorstehenden Code ist dieser Part, wo das XSL-Stylesheet via XPath die Informationen des XML-Input-Dokuments ausliest und in die FO-Zielstruktur mappt.
<xsl:for-each
select="/Orte/Ort/Mensch">
<fo:block>
<xsl:value-of select="vorname"/>
<xsl:text> </xsl:text>
<xsl:value-of select="name"/>
</fo:block>
</xsl:for-each>
Speichern Sie dieses XSL-Stylesheet ab (gern in dasselbe Verzeichnis, wo schon die anderen FO-Dateien enthalten sind), beispielsweise unter dem Namen "xslfo_pdf_test1.xsl". Damit Sie mit der Verzeichnis-Navigation keine überflüssige Arbeit haben, kopieren Sie das XML-Dokument ebenfalls hierher.
Nun starten Sie den FO-Prozessor wie folgt (die Zeilen habe ich zur besseren Übersicht umbrochen, in der Eingabeaufforderung sollten Sie die Parameter in dieselbe Zeile schreiben):
C:\wg\fop-2.2>fop
-xsl xslfo_pdf_test1.xsl
-xml Ort_Elemente.xml
-pdf Ort_Elemente.pdf
Wenn auch das geklappt hat (Erfolgsmeldung: "INFORMATION: Rendered page #1."), dann können Sie die frisch ezeugte Datei "Ort_Elemente.pdf" per Doppelklick öffnen und das Ergebnis bestaunen.
Was ist bei diesem Kommandoaufruf passiert? Der XSL-Prozessor hat das XML-Input-Dokument via XSL-Stylesheet in eine FO-Zwischendatei konvertiert. Anschliessend übernahm der FO-Prozessor die Konvertierung der FO-Datei nach PDF.
Die FO-Zwischenkonvertierung bekommen Sie bei dem obigen Programmaufruf nicht zu sehen, Sie können sie sich aber in einer Datei sichtbar machen:
C:\wg\fop-2.2>fop
-xsl xslfo_pdf_test1.xsl
-xml Ort_Elemente.xml
-foout Ort_Elemente.fo
Wenn Sie diese Datei öffnen, erkennen Sie die FO-Struktur mit den Inhalten, die Sie via XSL aus dem XML-Quelldokument entnommen haben.
<fo:root
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master
margin-right="15mm"
margin-left="2cm"
margin-bottom="1cm"
margin-top="2cm"
page-width="21cm"
page-height="297mm"
master-name="layout1">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="layout1">
<fo:flow flow-name="xsl-region-body">
<fo:block>Hugo Holzflos</fo:block>
<fo:block>Nicole Nixlos</fo:block>
<fo:block>Stefan Sprachlos</fo:block>
<fo:block>Stefan Sagblos</fo:block>
<fo:block>Siggi Sorglos</fo:block>
<fo:block>Heini Herzlos</fo:block>
<fo:block>Rudi Rhodos</fo:block>
<fo:block>Karl Kolos</fo:block>
<fo:block>Simone Sinnlos</fo:block>
<fo:block>Horst Hirnlos</fo:block>
<fo:block>Werner Wertlos</fo:block>
<fo:block>Ludwig Lustlos</fo:block>
<fo:block>Willi Wasistlos</fo:block>
<fo:block>Rita Ruhelos</fo:block>
<fo:block>Susi Schlaflos</fo:block>
<fo:block>Lotte Rielos</fo:block>
<fo:block>Betty Bodenlos</fo:block>
<fo:block>Martin Muehelos</fo:block>
<fo:block>Liane Leinenlos</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
wg / 16. Juni 2020
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de