XSL-FO (Extensible Stylesheet Language – Formatting Objects) ist eineXML-Auszeichnungssprache, die beschreibt, wie Text, Bilder, Linien und andere grafische Elemente auf einer Seite angeordnet werden.Mit XSL-FO kann man Dokumente nicht nur für die Darstellung auf Bildschirmen formatieren, sondern auch für qualitativ hochwertige Druckerzeugnisse auf Papier.Mit XSL-FO können Dokumente sogar für das Vorlesen über einen Sprachsynthesizer formatiert werden.
XSL-FO ist ein Teil derXSL-Spezifikation desW3C.
XSL-FO ist einedarstellende Auszeichnungssprache, die ihre Wurzeln inDSSSL hat und zeitweise mitCSS parallel entwickelt wurde. Die entscheidenden Unterschiede zwischen XSL-FO und CSS sind das Seitenmodell (Bereiche in XSL-FO,Box-Model in CSS) und das Prozessmodell (zweistufige Verarbeitung unter Nutzung vonXSLT und danach die Layoutierung mit XSL-FO-Formatierern einerseits und die Ad-hoc-Formatierung mit CSS-Renderern andererseits).XSL-FO enthält Elemente und Attribute für folgende Aspekte:
Die Liste ist, speziell im Hinblick auf XSL 1.1, bei weitem unvollständig.
XSL-FO wurde nicht für die Textverarbeitung, sondern für den professionellen Druck entwickelt, weshalb der Funktionsumfang dieser beiden Techniken nur schwer zu vergleichen ist.Nimmt man zu XSL-FO jedoch XSLT als Transformationssprache hinzu, können viele Funktionen heutiger Textverarbeitungssysteme mit den beiden Sprachen nachgebildet werden.Dabei hat man jeweils eine Sprache für Darstellung (durch XSL-FO) und Verarbeitungslogik (XSLT), Textverarbeitungssysteme fassen beide Aufgabenbereiche meist in einer Sprache und an einer Stelle zusammen.
Für die Generierung vonPDF,RTF,ASCII-Text und sonstigen Print-Medien aus einer XSL-FO-Datei stehen sogenannteFO-Prozessoren zur Verfügung. Ein weit verbreitetes Programm istFOP (Formatting Objects Processor) aus demApache-Projekt (siehe Weblink), eineJava-Anwendung, die aus XSL-FO-Daten PDF-Dokumente erzeugt und teilweise auchPostscript undPCL unterstützt. Für.Net-Framework-Entwicklungen gibt es eine sehr eingeschränkte PortierungNFop des Java-Projekts, welche lediglich das Ausgabeformat PDF unterstützt. In vielen Industriebereichen werden jedoch kommerzielle Formatierer verwendet, die zum einen größere Teile der Spezifikation unterstützen, andererseits auch eigene Erweiterungen enthalten, die nicht Bestandteil von XSL-FO, aber für den Praxisgebrauch zwingend notwendig sind, z. B. weitere Ausgabeformate.

Der Ausgangspunkt ist ein XML-Dokument, das mittels XSLT-Stylesheets in eine XSL-FO-Datei umgewandelt wird.Das XSLT-Stylesheet wählt aus dem Ursprungsdokument die erforderlichen Elemente aus und transformiert sie in eine Kombination aus XSL-FO-Elementen und -Attributen (denFO-Baum).Diese legen das Erscheinungsbild im Zielmedium fest (beispielsweise Seitengestaltung, Gestaltung von Spalten, Listen, Tabellen usw.).Dieser Vorgang wiederholt sich, bis das Ursprungsdokument vollständig abgearbeitet ist.In einem zweiten Schritt erzeugt ein geeigneter Formatierer (auch FO-Prozessor genannt) die gewünschte Zieldatei (z. B. PDF, RTF oder PostScript).
Folgendes Beispiel definiert eineDIN-A4-Seite mit dem TextHallo Welt!:
<?xml version="1.0"?><fo:rootxmlns:fo="http://www.w3.org/1999/XSL/Format"><fo:layout-master-set><fo:simple-page-mastermaster-name="myA4page"page-width="210mm"page-height="297mm"><fo:region-bodyregion-name="xsl-region-body"margin="2cm"/></fo:simple-page-master></fo:layout-master-set><fo:page-sequencemaster-reference="myA4page"><!-- (in Versionen < 2.0 "master-name") --><fo:flowflow-name="xsl-region-body"><fo:block>HalloWelt!</fo:block></fo:flow></fo:page-sequence></fo:root>