XSL-FO

**XSL-FO** 是 **XSL Formatting Objects** 的縮寫，它是一種用於文檔格式的 XML 置標語言。XSL-FO 是 XSL 的一部分，而 XSL 是一組定義 XML 數據轉換與格式的 W3C 技術。XSL 的其他部分有 XSLT 與 XPath。截止到 2006 年 12 月 12 日，XSL-FO 的最新版本是 v1.1 （頁面存檔備份，存於網際網路檔案館）。

## XSL-FO 基礎

與其他的 HTML 與 CSS 組合不同，XSL-FO 是一種 unified 表示語言，它沒有 HTML 中那樣的置標語法格式，並且與 CSS 更改外部 XML 或者 HMTL 文檔的預設表示不同，XSL-FO 將所有的文檔數據保存在內部。

XSL-FO 總的設計思想用戶寫到文檔中的數據是 XML 語言的文檔，而不是 FO，所用語言可以是 XHTML、DocBook 以及 TEI 或者其他任何的 XML 語言。然後，用戶自己寫一個或者找一個 XSLT 變換，將 XML 轉換成 XSL-FO。

一旦生成了 XSL-FO 文檔，就將它送到 FO 處理器這樣的應用程式中。FO 處理器將 XSL-FO 文檔轉換成可以閱讀或者可以列印的格式。最常見的 XSL-FO 輸出格式是 PDF 或者 PostScript，有一些 FO 處理器只能輸出成 RTF 這樣的格式或者只能輸出到圖形用戶界面的頁面序列及內容。

人們最初認為 XSLT 語言本身僅僅是為這個目的所用的，但是現在由於更加通用的 XML 轉換的出現已經超出了這個範圍。由於這個轉換是一個必然的過程，因此人們也常常將 XML 轉換為 XSL-FO 的 XSLT 當作 XSL-FO 文檔本身。甚至是 XSL-FO 的教程也在 FO 處理用法也用 XSLT 命令表示。

XSLT 轉換過程功能非常強大，它可以自動生成內容的列表、參考連結、索引以及其他的結果。

XSL-FO 文檔與 PDF 或者 PostScript 文檔不同，它沒有充分地描述文本在不同頁面上的布局，相反，它僅僅描述了頁面外觀以及不同內容放置的位置。根據這些，FO 處理器依據 FO 文檔中描述的邊界確定文本的位置。XSL-FO 規範甚至允許不同的 FO 處理器根據所生成的頁面有不同的響應。

例如，有些 FO 處理器為了節約空間在換行的時候會加入連字符，有些卻不會這樣做。不同的處理器甚至會使用不同的連字符算法，從一些簡單的算法到需要考慮前後行是否也許要連字符這樣複雜的算法。這樣就會在不同的頁面改變頁面布局，尤其是帶有邊框的時候更是這樣。另外還有一些場合，XSL-FO 規範明確允許 FO 處理器根據布局作出一定的選擇。

雖然不同的 FO 處理器生成的結果並不一致，但是人們並不太關心。這是因為 XSL-FO 的目的是生成經過分頁的可列印媒體。XSL-FO 文檔本身通常用於中介的媒體，通常用於生成 PDF 文件或者作為最終要分發的列印文檔。這與 HTML 直接作為最終形式分發給用戶有所不同。因此，如果需要生成一個列印文檔，只需要選擇滿足需要的 FO 處理器，比如布局效果以及較少的空白等，而無需在不同的處理器上測試 XSL-FO 文檔。

## XSL-FO 語言的概念

XSL-FO 語言的設計目的是用於分頁媒體，採用的方式是類似於用於非分頁媒體的 HTML 以及 CSS。因此，頁面是 XSL-FO 結構內在的一個概念，FO 賦予了用戶很大的權利以確定如何在頁面上顯示信息。

FO 最適合用在「內容驅動」設計的場合，這是圖書、文章、法律文檔等排版所用的標準方法。這涉及到一行鄰近的文本以及嵌入在頁面邊界中的不同變化信息。這與報紙與雜誌中所用的「布局驅動」設計有所不同。在那些文檔中，如果無法在特定的位置完整地放進去，那麼就會對內容進行裁減。XLS-FO 很難處理雜誌布局的嚴格要求，實際上在很多場合，它根本不具備表示所需布局的能力。

儘管這種語言有這些設計局限，但是它仍然能夠勝任很多的表現任務。它提供表格、列表、side floats 等許多特性。這些特性與 CSS 的布局特性類似，但是其中一些特性需要用 XSLT 表示。

## XSL-FO 文檔結構

XSL-FO 文檔是 XML 文檔，但是不必遵循 DTD 或其模型規範。相反，它們遵循 XSL-FO 規範中定義的語法。

XSL-FO 文檔包括兩個必須部分。第一部分列出頁面布局的細節，第二部分是帶有置標的文檔數據，根據不同的頁面布局確定如何在不同的頁面上擺放內容。

頁面布局定義了頁面的屬性。可以定義文本的排列方向以滿足不同語言的要求，定義頁面的尺寸以及頁面邊界。更加重要的特點是，它可以定義頁面的順序從而允許偶數頁與奇數頁的布局不同。例如，用於列印的文檔可以定義更大的邊界；在需要裝訂的時候可以留出更大的邊界。

文檔數據部分是一系列的數據流組成的，每個數據流都附屬於一個頁面布局。數據流包括一系列的按順序排列的數據塊，每個部分一系列的文本數據、內嵌的置標元素或者是二者的組合。在文檔邊界上也可以加入頁碼、章節等類似內容。

數據塊以及內嵌元素的功能非常類似於 CSS，但是空白的填補與保留在 FO 與 CSS 之間有所不同。相對於頁面方向的數據塊及內嵌元素排列方向可以進行充分的定義，這樣 FO 文檔可以處理與英文排列方向不同的其他語言。FO 規範的語言與 CSS 2.1 不同，使用開始與結束這樣的呈方向中性的術語而不是左與右來表示方向。

XSL-FO 的基本內容置標是從 CSS 及其層疊規則派生出來的，因此 XSL-FO 中的許多屬性除非進行了顯示重載否則就會延伸到子元素的部分。

## XSL-FO v1.0 的功能

XSL-FO 有許多處理文本布局的功能。除了上面介紹的一些之外，XSL-FO 語言可以完成下面定義的功能。

### 多欄

一個頁面可能需要多欄的布局，在這種情況下，數據塊按照順序從一欄排到下一欄。單個的數據塊可以擴展到所有欄，在頁面中生成文本的分隔。分隔符上面的數據連在一起，下面的也連在一起，但是上面的不能與下面的連在一起。

根據 XSL-FO 頁面規範的特性，每個頁面可能會有不同的分欄及欄寬，因此文本可以很容易地從每頁 3 欄轉到每頁 5 欄或者每頁 1 欄。

FO 的所有特性都能在多欄頁面的約束下正常工作。

### 列表

XSL-FO 列表本質上就是兩列並排排列的數據塊。每個條目都由左側或者一行開始方向的數據與右側或者一行結束方向的數據塊組成。從概念上來說左側就是列表的編號或者標誌。但是，也可以是術語表中列出的簡單的字符串或者文本。右側的數據就是所要的結果。這兩塊數據都可以在同一個數據列表條目中包含多個數據塊。

通常 XSL-FO 列表的編號是 XSLT 或者其他生成 XSL-FO 文檔的過程產生的。因此，編號列表通常在 XSL-FO 顯式地進行編號。

### 分頁控制

用戶可以指定 Widow 和 Orphan 的處理方式。另外，用戶可以指定一個文本塊不被分割。例如，一個圖片和圖片的說明應在一起顯示。FO 處理器會盡力保證這些命令的實現。

### 腳註

用戶可以在頁面的底部創建腳註。在 FO 文檔中，腳註就像其他文字一樣，寫在他被引用的地方，FO 處理器會把它當作一個或多個文字塊放在頁面的底部。FO 處理器保證，不論被引用的是什麼，腳註都會和被引用的內容處在同一頁中。只有在極個別的情況下，這樣的處理會產生額外的空行。

### 表格

FO 表格功能非常類似於 HTML/CSS 表格的功能。用戶定義每個單元格的行，用戶也可以定義每列的格式，如背景顏色等。另外，用戶也可以將第一行定義為表格標題，並且可以有自己的格式。

可以精確地告訴 FO 處理器每列的寬度，也可以讓用自動寬度匹配的方法分配寬度。

### 文本方向控制

FO 有強大的文本方向控制能力。在一頁中間可以設定另外一種不同的文本板塊方向。這種文本板塊的方向控制可以用於不同語言的方向，或者是僅僅用於排版目的。實際上這些板塊可以包含從表格、列表、甚至是另外一個重新排列方向的文本板塊等在內的所有數據塊。

### 其他

* 頁碼引用。在文本中可以引用包含特殊標記符的頁面，FO 處理器將在標記符出現的地方添加實際的頁碼。
* 多種風格板塊邊框
* 背景顏色與圖像
* 字體控制與大小，與 CSS 類似
* 側面浮動條
* 其他內嵌元素

## XSL-FO v1.1 的功能

與 1.0 版相比，XSL-FO 1.1 版加入了許多新的功能。

### 多數據流及數據流映射

XSL-FO 1.0 對於一頁中文本的排列位置的要求相當嚴格，而 1.1 版大幅度地放寬了這些限制，允許文本數據流能夠映射到一頁中多個區域。這樣就可以象報紙那樣進行排版。

### 書籤

許多用於 XSL-FO 處理器的輸出格式，尤其是 PDF 格式都帶有書籤特性。這樣就可以在一個獨立的窗口中定義特定的字符串讓用戶選擇。當用戶選擇之後，文檔窗口就會立刻自動滾動到文檔中的特定區域。

現在 XSL-FO v1.1 中增加了添加書籤的能力，這樣處理器就可以將書籤傳遞給支持這種功能的格式。

### 索引

XSL-FO 1.1 支持生成某些圖書後面具有的索引功能，這是通過對 FO 文檔中進行正確標記的元素進行索引所完成的。

## XSL-FO 的優點

由於 XSL-FO 是一種 XML 語言，因此從任何的 XML 語言生成 XSL-FO 代碼僅僅需要 XSLT 變換以及 XSLT 處理器。人們可以很容易地創作一個 TEI 或者 DocBook 格式的文檔，然後將它轉換成 HTML 用於網絡瀏覽或者經過 FO 處理器轉換成 PDF 用於列印。實際上，現在已經有許多用於這些目的的 TEI 以及 DocBook XSLT 轉換工具。

另外，由於它是一種 XML 語言，尤其是由於它沒有固定的語法或者文件類型定義，它可以保存所有類型的 XML 數據。最常見的數據有 SVG 圖像，許多 FO 處理器都可以讀取或者將它加入到文檔中。

XSL-FO 的另外一種優點是用法相當簡單。這種語言大多數的功能都是基於 CSS 的工作，因此 CSS 用戶對於那些基本的標記屬性相當熟悉。相對於難於理解的 TeX 這樣的布局與排版來說，FO 文檔的特定部分將如何顯示也顯得很容易理解。

## XSL-FO 的缺點

FO 的主要缺點是對於它的支持不多。FO 很難、或許沒有一家能夠具有與規範 100% 的兼容性。儘管規範已經出現了很多年，但是現實仍然是這樣。通常這是由於缺少對於 XSL-FO 的需求而引起的。TeX 及其他類似產品已經在排版語言市場上占據了很長時間，大多數 TeX 用戶都沒有切換到 XSL-FO 的需求。

XSL-FO 另外一個不太嚴重的缺點是將數據排列到頁邊的功能不夠強大，控制類似數據的能力可能沒有用戶所想像的那樣。

FO 的另外一個問題是，儘管容易理解，但是如果手工生成這樣的文檔非常困難，並且非常繁瑣。XSLT 就是用來更加方便地生成 XSL-FO 文檔的，因此沒有使 FO 文檔更加簡練的推動力。這樣帶來的問題就是新手不僅要學習如何寫 FO 文檔的細節，而且要學習寫 XSLT 變換。當然，如果不是從一個現有的用於標準文檔格式的 XSLT 變換開始，這會變得很困難。

## 參見

* XML
* XSL
* XSLT
* Cascading Style Sheets
* XHTML

## 外部連結

* XSL-FO 1.0 Specification （頁面存檔備份，存於網際網路檔案館）
* XSL-FO 1.1 Specification （頁面存檔備份，存於網際網路檔案館）
* What is XSL-FO? （頁面存檔備份，存於網際網路檔案館） on XML.com