XSL Formatting Objects (XSL-FO) は、XSL (XML Stylesheet Language) の一部で、組版の制御・指示のための仕様である。狭義にはXSL仕様で定義されている組版対象オブジェクトのことである。XSLは、XSL-FOの他、XSLTとXPathから構成される。XSLはXML文書の変換と組版を行うために開発された。XSLの構成要素の一つであるXSL-FOでは、視覚的媒体だけでなく、聴覚的媒体に関する制御も規定している。XSL-FOを含むXSL関連仕様は標準化団体 W3C (World Wide Web Consortium) で開発され勧告として公表されている。

 1999年11月16日に XSLT 1.0 と XPath 1.0 が勧告となり公表された。
 2001年10月15日に XSL (XSL-FO) 1.0 の勧告が公表された。
 2006年12月5日に XSL (XSL-FO) 1.1 の勧告が公表された。
 2007年1月23日に XSLT 2.0 と XPath 2.0 の勧告が公表された。
 2014年4月8日に XPath 3.0 の勧告が公表された。
 2017年3月21日に XPath 3.1 の勧告が公表された。
 2017年6月8日に XSLT 3.0 の勧告が公表された。

概要 

XSL-FO文書も、（XSLTにより） XSL-FO形式に変換する前の文書も、ともにXMLに準拠したマークアップ言語である。このことは、XHTML/HTML と CSS を組み合わせて使う場合とは対照的である。XHTML/HTML は XML/SGML に準拠しているが、CSS は独自の構文で記述する言語でありXMLに準拠していない。

XSL-FOでは、XHTMLとは異なり、意味に基づいたマークアップは行わず、組版で必要となるマークアップのみを行う。また、XSL-FO文書自身に組版の対象となる文書データが全て格納される。一方で CSS は、別の XML もしくは XHTML 文書の既定の表現を変更する方法を採っている。

視覚的表現のための他の手段には、XHTML、DocBook および TEI などの利用がある。XSL は、XSLT が任意の XML を処理可能であるため、どのような XML 文書に対しても適用できる。また出力手段も XSL-FO に限らず、XSLT によって XHTML などに変換する（XMLベースであればなんでも）、といったことも可能である。

XSL では、まずXSLTスタイルシートを使うことが多い。このXSLTスタイルシートは対象となるXML文書の文書型 （スキーマ） にあわせて記述される。XSLTスタイルシートは、組版を行う人自身が記述する場合もあるが、文書型にあわせて作成された既製のものを使うこともできる。このXSLTスタイルシートを適用することにより、対象となるXML文書は、XSL-FO文書に変換される。

XSL-FOでは、XML文書の一般的な作成者は、普通のXML文書を作成するのであり、直接にXSL-FO形式のXML文書を作成することは、想定していない。XSL-FOでは、XML文書の作成者が作成したXML文書をXSLTを使ってXSL-FO形式のXML文書に変換すると、想定している。XSLTのスタイルシートは、作成したXML文書とは別途作成する場合と、XML文書自身に埋め込む場合がある。XSL-FO文書の生成は、XSLTによる変換によって行うことができるが、適切なXSL-FO形式に生成できるのであれば、XSLTを使わずに任意の手段で生成して構わない。

XSLTは、当初はXSL-FOへの変換という用途のみが想定されていたが、XML文書の汎用的な変換に使用可能である。現時点では、多くのソフトウェア技術者（プログラマ）はXSLTをXML文書の汎用的な変換言語として認識しており（認識の問題ではなく、汎用であるということは単なる事実であるが）、XML文書をXSL-FO文書に変換するという用途はあまり認識されていない。

XSLTの変換は非常に強力である（チューリング完全である）。XSLTを使うことによって自動的に、文書の目次を生成したり、参考文献とのリンクを設定したり、索引を生成するなど、非常に多様な能力をもつ。

XSL-FO形式の文書が生成されると、XSL-FOの処理系がそのXSL-FO文書を処理して組版する。XSL-FO処理系は、XSL-FO文書を入力として、一般の人々にとって読みやすいファイル形式ないしは印刷/表示可能な媒体を、出力する。出力可能な形式の種類は、XSL-FO処理系の実装により異なる。現在、XSL-FOで最も一般的な出力形式はPDFである。実装によっては、PostScriptやRTFなどの他の形式での出力も可能であるし、ファイルを作成せずに直接にコンピュータ画面に表示したり、直接印刷することもできる。

XSL-FOの基本的な考え方 
XSL-FOは、複数のページで構成される媒体を想定して設計された。一方HTMLとCSSは、ページの概念が無い媒体 （コンピュータ画面など） を想定して設計されている。XSL-FOにおいてページの概念は不可欠な要素である。XMLを扱う人々にとって、XSL-FOの処理系は、複数のページで情報を表示する際には強力なツールである。

XSL-FOの基本的な考え方は、コンピュータによる組版である。XSL-FO文書には、印刷対象となる文書データと文書データに対する組版の制約情報が含まれている。このXSL-FOをもとに、XSL-FO処理系は組版を行う。XSL-FOはこうした仕組みに基づいているため、あるXSL-FO処理系による出力と、別のXSL-FO処理系による出力が、一致しないことがある。しかしXSL-FOの一般的な目的は、複数のページで構成された組版された媒体を生成することであるため、あまり問題にはならない。XSL-FOの使い方としては、紙などに印刷された文書やPDFファイルの生成が、一般的である （PDFファイルもその性質は印刷された文書に近い） 。

XSL-FOは、「内容駆動」(content-driven) と呼ばれる設計による組版に非常に適している。この組版の設計は、書籍や論文、法的文書などで標準的な方法である。この組版設計は、一つの連なったテキストに対応する単一の流し込み （フロー） 領域をもち、ページの余白にさまざまな情報を配置することができる。この設計は、「割り付け駆動」(layout-driven) の設計とは、対義的な設計方法である。割り付け駆動の組版の設計方法は、新聞や雑誌などで使われている。割り付け駆動の設計では、ある文書内容に必要な空間を充分に確保できなかった場合、割り付けを調整して充分に確保しない限り、文書内容は途中までしか印字できない。XSL-FOでは、新聞や雑誌におけるこのような窮屈な制約を制御することは、簡単なことではない。実際にXSL-FOでは、多くの場合、先述のような割り付けの形式を表現する機能がいくつか欠如している。

XSL-FOは基本的にこのように設計されているが、非常に豊富な表現力をもつ。表、リスト、側浮動体 （本文とは分離した領域） 、その他さまざまな機能を備えており使うことができる。XSL-FOのこうした多くの機能はCSSの組版機能と互換性がある。

XSL-FO文書の構造 
XSL-FO文書はXML文書であるが、明示的なDTDないしスキーマに従う必要は無く、XSL仕様においてXSL-FO文書の構文が定義されている。

XSL-FO文書は、大きく分けて2つの必須の部分から構成される。

 最初の部分で、ページのレイアウトを詳しく定義する。レイアウトは1つまたは複数定義することができる。各レイアウトには名前をつける。
 次の部分で、一連の文書データを記述する。文書データにはXSL-FOで規定されたマークアップを行う。このマークアップにより、文書データを構成する内容が、先の部分で定義したページレイアウトのうち、どのページレイアウトによって表現されるかを指定する。

最初の部分 （layout-master-set要素） のページレイアウト定義では、ページの特徴を定義する。

 テキストの表記方向を定義することができる。「右から左に文章を進める」「上から下に文章を進める」「左から右に文章を進める」など、言語に固有の重要な慣習に沿うように指定することができる。
 ページの縦横の長さやページの余白 （マージン） の長さを指定することができる。
 ページの連なりについて定義することができる。例えば、奇数ページと偶数ページとで余白などの指定を変えることが可能である。

例えば、印刷するために大きな余白を確保するようページレイアウトの定義をすることができる。
製本するためにさらに大きく余白をとることもできる。

次の部分 （page-sequence要素） では、文書データを分割して複数のフローに再構成する。

 おのおののフローは、ページレイアウト定義と関連付けられる。
 フローは、複数のブロックを含むことができる。
 各ブロックには、順番に、テキストデータ、インライン要素、およびテキストデータとインライン要素の混合内容を、含めることができる。
 ページの余白の部分にも、ページ番号や章見出しなどを、印字することができる。

XSL-FOとCSSは、良く似ている概念を採用しているが、いくつかの違いもある。
ブロックとインライン要素の概念は、CSSと非常に良く似ている。
間隔 (padding) と余白 (margin) の規則のいくつかは、CSSと異なる。
表記方向 (direction) に関しては、XSL-FO ではページの特性に沿って全て指定することができる。

 インラインのテキストなどの表記方向 （「左から右へ」「上から下へ」など）
 ブロック内のテキスト行などの流し込みの方向 （「上から下へ」「右から左へ」など）

このXSL-FOでの表記方向の指定機能により、英語とは異なる方向で文章を記述する慣習のある言語にも対応している。
日本語などの縦書きにも対応している。
ただしXSL-FO処理系の実装としては、少なくとも1つの表記方向に対応することが必須であり、全ての表記方向に対応する必要は無い。
XSL-FOの仕様では、CSS2.1とは異なり、方向に関して表記方向に基づいた用語を採用している。
start （前） や end （後） などを使い、left （左） や right （右） などは、出力媒体に直接関わる場合を除いて、使われない。

XSL-FOの基本的な文書内容のマークアップは、CSSおよびそのカスケーディング規則を基にしている。
そのためXSL-FO文書で記述した要素の多くの属性は、明示的に上書きしない限り、子要素に継承される。

XSL-FOの機能 
XSL-FOには非常に多くの機能がある。
先に述べたことに加え、XSL-FOでは次のような機能を仕様で規定している。

段組 
複数の段数で段組のページを記述することができる。
段組のページを記述する場合、既定ではブロックはある段から次の段へと流し込まれる。
あるブロックを全ての段をまたがって配置することができる。
その場合はページ中に本文の区切りを入れる。
この区切りより前の本文は、この区切りより前方の各段に順に流し込まれる。
区切りより後の本文についても、区切りより後方の各段に順に流し込まれる。
ただしこの場合は区切りをまたがって、区切りの前の部分から区切りの後の部分にかけて、文章を流し込むことはできない。

段組で記述されたページでも、XSL-FOの全ての機能は有効である。

リスト 
XSL-FOのリストは、他のリストと同様にリスト要素が複数並んだものとして構成される。
リスト要素は、要素のラベルと要素の本体から構成される。
リスト要素のラベルには、明示的な順序つきリストであれば数字かアルファベットが含まれ、明示的な順序なしのリストであれば中黒が含まれ、定義リストであれば簡単な文字列 （定義の対象となる用語） が含まれることになるだろう。
リスト要素の本体には、要素の実質的な内容が記述される。
リストのラベルと本体をどのように配置するかは、XSL-FO文書のページレイアウトの記述に依存する。

 日本語や英語などで横書きで書く場合、リスト要素のラベルを左側に、リスト要素の本体を右側に配置して、組版する。
 アラビア語などで書く場合は、逆にリストのラベルを右側に、リスト要素の本体を左側に配置して、組版する。

あるリスト要素で、そのラベルもしくは本体が「ブロックコンテナ」を含む可能性がある。
ブロックコンテナとは、複数のブロックを含む要素をいう。

ページ付け制御 
XSL-FOでは、ブロックあるいはフロー自体に対して、段落の途中で改ページを行うことになった場合、前のページに最低限残すべき行数と、後のページに最低限印字すべき行数を指定することができる。
この指定は、そのブロックが子ブロックを含む場合は継承される。
また、ブロック全体を分割せずに1ページ内に収めるよう、指定することもできる。
例えば、画像のブロックとその画像の説明文が、別々のページに分割されることは望ましくない。
XSL-FO処理系は、たとえページ中に大きな空白部分を作ることになっても、これらの指定に従うように努める。