XSLFO 是 XSL Formatting Objects 的縮寫，它是一種用於文件格式的 XML 置標語言。XSLFO 是 XSL 的一部分，而 XSL 是一組定義 XML 資料轉換與格式的 W3C 技術。XSL 的其他部分有 XSLT 與 XPath。截止到 2006 年 12 月 12 日，XSLFO 的最新版本是 v11 。 XSLFO 基礎 與其他的 HTML 與 CSS 組合不同，XSLFO 是一種 unified 表示語言，它沒有 HTML 中那樣的置標語法格式，並且與 CSS 更改外部 XML 或者 HMTL 文件的預設表示不同，XSLFO 將所有的文件資料儲存在內部。 XSLFO 總的設計思想使用者寫到文件中的資料是 XML 語言的文件，而不是 FO，所用語言可以是 XHTML、DocBook 以及 TEI 或者其他任何的 XML 語言。然後，使用者自己寫一個或者找一個 XSLT 變換，將 XML 轉換成 XSLFO。 一旦生成了 XSLFO 文件，就將它送到 FO 處理器這樣的應用程式中。FO 處理器將 XSLFO 文件轉換成可以閱讀或者可以列印的格式。最常見的 XSLFO 輸出格式是 PDF 或者 PostScript，有一些 FO 處理器只能輸出成 RTF 這樣的格式或者只能輸出到圖形使用者介面的頁面序列及內容。 人們最初認為 XSLT 語言本身僅僅是為這個目的所用的，但是現在由於更加通用的 XML 轉換的出現已經超出了這個範圍。由於這個轉換是一個必然的過程，因此人們也常常將 XML 轉換為 XSLFO 的 XSLT 當作 XSLFO 文件本身。甚至是 XSLFO 的教程也在 FO 處理用法也用 XSLT 命令表示。 XSLT 轉換過程功能非常強大，它可以自動生成內容的列表、參考連結、索引以及其他的結果。 XSLFO 文件與 PDF 或者 PostScript 文件不同，它沒有充分地描述文字在不同頁面上的佈局，相反，它僅僅描述了頁面外觀以及不同內容放置的位置。根據這些，FO 處理器依據 FO 文件中描述的邊界確定文字的位置。XSLFO 規範甚至允許不同的 FO 處理器根據所生成的頁面有不同的響應。 例如，有些 FO 處理器為了節約空間在換行的時候會加入連字元，有些卻不會這樣做。不同的處理器甚至會使用不同的連字元演算法，從一些簡單的演算法到需要考慮前後行是否也許要連字元這樣複雜的演算法。這樣就會在不同的頁面改變頁面佈局，尤其是帶有邊框的時候更是這樣。另外還有一些場合，XSLFO 規範明確允許 FO 處理器根據佈局作出一定的選擇。 雖然不同的 FO 處理器生成的結果並不一致，但是人們並不太關心。這是因為 XSLFO 的目的是生成經過分頁的可列印媒體。XSLFO 文件本身通常用於中介的媒體，通常用於生成 PDF 檔案或者作為最終要分發的列印文件。這與 HTML 直接作為最終形式分發給使用者有所不同。因此，如果需要生成一個列印文件，只需要選擇滿足需要的 FO 處理器，比如佈局效果以及較少的空白等，而無需在不同的處理器上測試 XSLFO 文件。 XSLFO 語言的概念 XSLFO 語言的設計目的是用於分頁媒體，採用的方式是類似於用於非分頁媒體的 HTML 以及 CSS。因此，頁面是 XSLFO 結構內在的一個概念，FO 賦予了使用者很大的權利以確定如何在頁面上顯示資訊。 FO 最適合用在 內容驅動 設計的場合，這是圖書、文章、法律文件等排版所用的標準方法。這涉及到一行鄰近的文字以及嵌入在頁面邊界中的不同變化資訊。這與報紙與雜誌中所用的 佈局驅動 設計有所不同。在那些文件中，如果無法在特定的位置完整地放進去，那麼就會對內容進行裁減。XLSFO 很難處理雜誌佈局的嚴格要求，實際上在很多場合，它根本不具備表示所需佈局的能力。 儘管這種語言有這些設計侷限，但是它仍然能夠勝任很多的表現任務。它提供表格、列表、side floats 等許多特性。這些特性與 CSS 的佈局特性類似，但是其中一些特性需要用 XSLT 表示。 XSLFO 文件結構 XSLFO 文件是 XML 文件，但是不必遵循 DTD 或其模型規範。相反，它們遵循 XSLFO 規範中定義的語法。 XSLFO 文件包括兩個必須部分。第一部分列出頁面佈局的細節，第二部分是帶有置標的文件資料，根據不同的頁面佈局確定如何在不同的頁面上擺放內容。 頁面佈局定義了頁面的屬性。可以定義文字的排列方向以滿足不同語言的要求，定義頁面的尺寸以及頁面邊界。更加重要的特點是，它可以定義頁面的順序從而允許偶數頁與奇數頁的佈局不同。例如，用於列印的文件可以定義更大的邊界；在需要裝訂的時候可以留出更大的邊界。 文件資料部分是一系列的資料流組成的，每個資料流都附屬於一個頁面佈局。資料流包括一系列的按順序排列的資料塊，每個部分一系列的文字資料、內嵌的置標元素或者是二者的組合。在文件邊界上也可以加入頁碼、章節等類似內容。 資料塊以及內嵌元素的功能非常類似於 CSS，但是空白的填補與保留在 FO 與 CSS 之間有所不同。相對於頁面方向的資料塊及內嵌元素排列方向可以進行充分的定義，這樣 FO 文件可以處理與英文排列方向不同的其他語言。FO 規範的語言與 CSS 21 不同，使用開始與結束這樣的呈方向中性的術語而不是左與右來表示方向。 XSLFO 的基本內容置標是從 CSS 及其層疊規則派生出來的，因此 XSLFO 中的許多屬性除非進行了顯示過載否則就會延伸到子元素的部分。 XSLFO v10 的功能 XSLFO 有許多處理文字佈局的功能。除了上面介紹的一些之外，XSLFO 語言可以完成下面定義的功能。 多欄 一個頁面可能需要多欄的佈局，在這種情況下，資料塊按照順序從一欄排到下一欄。單個的資料塊可以擴充套件到所有欄，在頁面中生成文字的分隔。分隔符上面的資料連在一起，下面的也連在一起，但是上面的不能與下面的連在一起。 根據 XSLFO 頁面規範的特性，每個頁面可能會有不同的分欄及欄寬，因此文字可以很容易地從每頁 3 欄轉到每頁 5 欄或者每頁 1 欄。 FO 的所有特性都能在多欄頁面的約束下正常工作。 列表 XSLFO 列表本質上就是兩列並排排列的資料塊。每個條目都由左側或者一行開始方向的資料與右側或者一行結束方向的資料塊組成。從概念上來說左側就是列表的編號或者標誌。但是，也可以是術語表中列出的簡單的字串或者文字。右側的資料就是所要的結果。這兩塊資料都可以在同一個資料列表條目中包含多個數據塊。 通常 XSLFO 列表的編號是 XSLT 或者其他生成 XSLFO 文件的過程產生的。因此，編號列表通常在 XSLFO 顯式地進行編號。 分頁控制 使用者可以指定 Widow 和 Orphan 的處理方式 Widow 指一個段落的最後一行落到一個新頁，成為新頁的第一行；Orphan 相反，指一個段落的第一行單獨留在前一頁，而本段的其他內容在後面一頁。。另外，使用者可以指定一個文字塊不被分割。例如，一個圖片和圖片的說明應在一起顯示。FO 處理器會盡力保證這些命令的實現。 腳註 使用者可以在頁面的底部建立腳註。在 FO 文件中，腳註就像其他文字一樣，寫在他被引用的地方，FO 處理器會把它當作一個或多個文字塊放在頁面的底部。FO 處理器保證，不論被引用的是什麼，腳註都會和被引用的內容處在同一頁中。只有在極個別的情況下，這樣的處理會產生額外的空行。 表格 FO 表格功能非常類似於 HTMLCSS 表格的功能。使用者定義每個單元格的行，使用者也可以定義每列的格式，如背景顏色等。另外，使用者也可以將第一行定義為表格標題，並且可以有自己的格式。 可以精確地告訴 FO 處理器每列的寬度，也可以讓用自動寬度匹配的方法分配寬度。 文字方向控制 FO 有強大的文字方向控制能力。在一頁中間可以設定另外一種不同的文字板塊方向。這種文字板塊的方向控制可以用於不同語言的方向，或者是僅僅用於排版目的。實際上這些板塊可以包含從表格、列表、甚至是另外一個重新排列方向的文字板塊等在內的所有資料塊。 其他 頁碼引用。在文字中可以引用包含特殊標記符的頁面，FO 處理器將在標記符出現的地方新增實際的頁碼。 多種風格板塊邊框 背景顏色與影像 字型控制與大小，與 CSS 類似 側面浮動條 其他內嵌元素 XSLFO v11 的功能 與 10 版相比，XSLFO 11 版加入了許多新的功能。 多資料流及資料流對映 XSLFO 10 對於一頁中文字的排列位置的要求相當嚴格，而 11 版大幅度地放寬了這些限制，允許文字資料流能夠對映到一頁中多個區域。這樣就可以象報紙那樣進行排版。 書籤 許多用於 XSLFO 處理器的輸出格式，尤其是 PDF 格式都帶有書籤特性。這樣就可以在一個獨立的視窗中定義特定的字串讓使用者選擇。當用戶選擇之後，文件視窗就會立刻自動滾動到文件中的特定區域。 現在 XSLFO v11 中增加了新增書籤的能力，這樣處理器就可以將書籤傳遞給支援這種功能的格式。 索引 XSLFO 11 支援生成某些圖書後面具有的索引功能，這是透過對 FO 文件中進行正確標記的元素進行索引所完成的。 XSLFO 的優點 由於 XSLFO 是一種 XML 語言，因此從任何的 XML 語言生成 XSLFO 程式碼僅僅需要 XSLT 變換以及 XSLT 處理器。人們可以很容易地創作一個 TEI 或者 DocBook 格式的文件，然後將它轉換成 HTML 用於網路瀏覽或者經過 FO 處理器轉換成 PDF 用於列印。實際上，現在已經有許多用於這些目的的 TEI 以及 DocBook XSLT 轉換工具。 另外，由於它是一種 XML 語言，尤其是由於它沒有固定的語法或者檔案型別定義，它可以儲存所有型別的 XML 資料。最常見的資料有 SVG 影像，許多 FO 處理器都可以讀取或者將它加入到文件中。 XSLFO 的另外一種優點是用法相當簡單。這種語言大多數的功能都是基於 CSS 的工作，因此 CSS 使用者對於那些基本的標記屬性相當熟悉。相對於難於理解的 TeX 這樣的佈局與排版來說，FO 文件的特定部分將如何顯示也顯得很容易理解。 XSLFO 的缺點 FO 的主要缺點是對於它的支援不多。FO 很難、或許沒有一家能夠具有與規範 100 的相容性。儘管規範已經出現了很多年，但是現實仍然是這樣。通常這是由於缺少對於 XSLFO 的需求而引起的。TeX 及其他類似產品已經在排版語言市場上佔據了很長時間，大多數 TeX 使用者都沒有切換到 XSLFO 的需求。 XSLFO 另外一個不太嚴重的缺點是將資料排列到頁邊的功能不夠強大，控制類似資料的能力可能沒有使用者所想象的那樣。 FO 的另外一個問題是，儘管容易理解，但是如果手工生成這樣的文件非常困難，並且非常繁瑣。XSLT 就是用來更加方便地生成 XSLFO 文件的，因此沒有使 FO 文件更加簡練的推動力。這樣帶來的問題就是新手不僅要學習如何寫 FO 文件的細節，而且要學習寫 XSLT 變換。當然，如果不是從一個現有的用於標準文件格式的 XSLT 變換開始，這會變得很困難。 參見 XML XSL XSLT Cascading Style Sheets XHTML 外部連結 XSLFO 10 Specification XSLFO 11 Specification What is XSLFO on XMLcom Category 標記語言 Category 頁面描述語言 Category 基於 XML 的標準 CategoryW3C 標準