XSL 格式化物件(XSL-FO)基礎知識

XSL 格式化物件(XSL-FO)基礎知識


內文
XSL-FO 文件函式和結構
基本純文字格式化
純文字區塊間距與對齊
基本圖形
結語
參考資料
關於作者

XSL 格式化物件規範是 W3C 的正式建議,通常稱其為 XSL-FO,XSL-FO 定義了許多 XML 標籤,這些標籤描述了應如何顯示內容。儘管 XSL-FO 含有描述如何以非列印格式顯示純文字(如口語)的元素,本教學課程還介紹如何建立可移植文件格式(PDF)文件 ─ XSL-FO 最常見的使用方式。

本教學課程簡要概括了 XSL-FO 文件結構和定義頁面大小、字體和邊界的元素。它還介紹了純文字與圖形格式化的基本知識,並展示了將格式化物件文件轉換成 PDF 的基本原理。可下載的程式碼範例使得改寫範例以自行測試變得簡單。

當您學完這篇介紹性的教學課程時,您將理解 XSL-FO 是什麼以及它是如何工作的。您將能夠改寫已提供的基本範例以建立自己的簡單 FO 文件。您將準備好繼續學習本系列中的第二篇教學課程,以瞭解如何具體地控制純文字格式化,以及如何將 HTML 元素轉換為格式化物件。然後您將能夠建立自己的使用格式化物件產生高品質可列印文件的 XML 應用程式。

學習本教學課程需要什麼工具,應如何組態這些工具

要完成本教學課程中的練習,您要有 Java 開發者工具箱(Java Developer's Kit,JDK)V1.3 或更高版本和 Apache XML 專案的 FOP 套裝軟體。可以在 xml.apache.org/dist/fop 找到 FOP 套裝軟體。下載最新版本並將其解壓縮。

一旦安裝了 JDK 和 FOP,就需要設定類別路徑。

如果想使用本教學課程中的範例,而又不想總記著改寫這些範例,請將 FOP 套裝軟體放置在 c:\fop-0.20.4rc 中,然後如下設定類別路徑(當然,所有的項目都在一行;分行祇是為了適應這裡的純文字列寬)︰


set classpath=.;c:\fop-0.20.4rc\build\fop.jar;c:\fop-0.20.4rc\
lib\avalon-framework-cvs-20020315.jar;c:\fop-0.20.4rc\lib\bati
k.jar;c:\fop-0.20.4rc\lib\xalan-2.3.1.jar;c:\fop-0.20.4rc\lib\
xercesImpl-2.0.1.jar;c:\fop-0.20.4rc\lib\xml-apis.jar;

如果您在別的位置解壓縮 FOP 套裝軟體,那麼您需要相應地變更指令。如果正在執行 Linux,則使用指令 export classpath=/usr/bin/fop-0.20.4rc/build/fop.jar:/usr/bin/fop-...,諸如此類。

XSL-FO 文件函式和結構

XSL-FO 文件概述

XSL-FO 文件定義了製作高品質可列印文件時非常重要的幾件事情︰

  • 有關頁面的實際大小的訊息(letter 和 A4 等等)
  • 有關邊界(上、左、下和右)、頁首和頁 頁尾和頁面其它特性的訊息
  • 有關純文字的字體、字體大小、色彩和其它特性的訊息
  • 要列印的實際純文字,由描述段落、突出顯示、表等類似物的元素來標示

教學課程的這一章介紹紙張大小、邊界和其它頁面特性,同時還介紹了用於描述它們的 XSL-FO 元素。

在討論實際元素之前,讓我們先來看看將 XML 文件轉換為 PDF 文件的過程。

將 XML 文件轉換為 PDF 文件

將 XML 文件轉換為 PDF 文件需要兩個基本步驟︰

  1. 用 XSLT 樣式表將 XML 文件轉換為由 XSL-FO 元素構成的文件。要執行這一轉換,只需用 XML 文件和樣式表(本教學課程的第 2 部分含有將 XHTML 元素轉換成格式化物件的 XSLT 樣式表)呼叫 XSLT 處理器。
  2. 用某種顯示引擎(例如,本教學課程範例中使用的 FOP)將 XSL-FO 元素轉換為 PDF 文件。這個步驟甚至更簡單︰您只需呼叫 FOP 工具,將 XSL-FO 文件的名稱和 PDF 文件的名稱傳遞給它即可。

下圖說明了這個步驟︰


XSL-FO 文件結構一瞥

下圖簡單說明了 XSL-FO 文件的結構︰

元素含有 通常含有關於頁面版面的訊息,而 含有您正在格式化的實際內容。

XSL-FO 文件結構詳細介紹

讓我們先看一個簡單的 XSL-FO 文件,以及它含有的標籤與特性。儘管它看起來非常複雜,但不要被嚇倒 ─ 這個文件中的大多數內容從不改變。通常您不需要為每個專案考慮頁面版面;您祇要先建立一組有效的頁面版面然後重複使用它們。

首先看看 這幾個元素;所有這些元素都是定義文件各個方面。所有其它的項目則含有內容 ─ 隨不同文件而變化的部分。下面就是該文件︰



  
    
      
    
  
  
    
      
        This is a paragraph of text.  Notice that as 
        this meaningless 
          prose drones on and on, the FOP 
        software automatically calculates line breaks for us.  
        Isn't that fascinating?
      
    
  


如果您想瞭解 PDF 版本是什麼樣子,請看看該文件 。

元素

XSL-FO 文件的根元素是 元素。上面的範例文件在該元素中定義了 fo 名稱空間字首︰



...

...

 

通常,根元素含有一個 ,然後是一個或多個

元素

元素指定頁面定義。在簡單的文件中,一個版面可能就足夠了,但複雜的文件通常有幾個頁面定義。例如,您可能希望文件的奇數頁和偶數頁有不同的版面。可能某一章的第一頁或者目錄頁需要獨特的版面。您可以使用 元素來定義所需的每一種頁面版面;然後將它們放在 元素中。



  
  


元素

元素定義某個特定頁面的版面。下面是一個範例,其後是對每個特性的說明︰



  


  • master-name

    定義該頁面 master 的名稱。您可以建立幾個不同的 元素,然後,當您需要在整個文件中使用不同頁面版面時,可以參照其中的一個元素。

  • margin-topmargin-bottom

    定義頁面上和下的邊界。可接受的單位有點(point)、派卡(pica)、英吋(inch)和公分(centimeter)。

  • page-widthpage-height

    定義實際頁面的大小。該範例定義了 letter 大小的頁面;要使用 A4 大小的紙張,將屬性設定為 page-width="21cm"page-height="29.7cm" 即可。

  • margin-leftmargin-right

    定義頁面左邊和右邊的邊界。

在研究 元素本身之前,先考慮測量單位。

XSL-FO 文件中的單位

XSL-FO 支援這些用於長度特性的實際單位,以用於測量像 margin-leftpage-widthpage-height 這樣的項目︰

單位 含義
cm 公分
mm 毫米
in 英吋
pt 點(72 點 = 1 英吋)
pc 派卡(12 點 = 1 派卡,6 派卡 = 1 英吋)
px 像素(有時隨格式化程式或設備的不同而有所不同,所以要小心使用)
em 一個大寫 M 的寬度

要獲得更多的詳細資訊(包括像素的原理),可參閱 XSL-FO 規範(請參閱參考資料)。

元素

XSL-FO 規範定義了頁面上的五個區域;region-body 定義頁面正中的主要區域的大小。下面是一個範例︰




該元素為 region-body 區域定義了長度為 50 點的上和下邊界。頁面的其它四個區域是︰

  • region-before,頁面頂部的區域(常用於頁首)
  • region-after,頁面底部的區域(常用於頁尾)
  • region-start,頁面左邊的區域
  • region-end,頁面右邊的區域

下圖展示了通常是如何在頁面上安排這些區域的︰

您用合適的 元素定義每個區域的特性,並可以在以後參照這些區域。要參照不同的區域,可以使用它們的預設名稱,它們是 xsl-region-bodyxsl-region-before 等。

注︰這些定義假定文件中純文字的書寫方向是從左往右和從上往下的。如果您所用語言的字元是以其它方式書寫的,則那四個外部區域可能指的是頁面的不同區域。

元素

元素定義文件內使用的頁面版面的序列。指定版面序列是一項進階技術,將在本教學課程系列的第二部分中介紹。現在,本文中的範例祇是將一個名為 main 用於它所有的頁面︰


  

master-reference 在這裡指的是在 元素中定義的 master-name。正如您所料,如果所使用的 master-reference 在 XSL-FO 文件中沒有定義,就會產生錯誤。

元素

元素定義了會隨目前邊界、字體設定等改變的某些內容。換句話說,在此刻以前您所做的每件事都是定義頁面的版面;現在您將學習如何插入要顯示的某些內容。您可以依靠顯示程式(本例中的 FOP)自動地或根據您指定的規則來計算所有的換行符號、分欄符號和分頁符號。

下面的範例指明該 元素含有文件主體的內容(請記住,xsl-region-body 是頁面主要區域的預設名稱)。


    

flow-name 屬性命名的區域必須是五個預設名稱之一您在 XSL-FO 文件中定義的名稱;您將在本教學課程系列的第二部分瞭解如何給各頁面區域命名。現在,xsl-region-body 是您唯一需要考慮的。

用於內容的基本 XSL-FO 元素

用於格式化內容的兩個主要 XSL-FO 元素是 。以下是範例文件的內容︰



  This is a paragraph of text.  Notice that as 
  this meaningless 
  prose drones on and on, the FOP 
  software automatically calculates line breaks for us.  
  Isn't that fascinating?

是最基本的元素,用於格式化一個純文字區塊。您可以認為它類似於 HTML 中的

元素。 元素總是會產生一個換行。

在現有 內定義一些新的純文字特性。如果您希望用斜體顯示一段文字中的幾個單字(如範例中的單字),可以用 做到這一點。如果範例已經使用了 元素,則用斜體顯示的單字會作為單獨的一段出現。

您的第一個 PDF 文件

要從範例文件建立 PDF 文件,可以用 FOP 工具將 simple.fo 轉換為 simple.pdf。假定您已經正確設定了類別路徑(在學習本教學課程需要什麼工具,應如何組態這些工具中有描述),那麼您可以用以下指令執行 FOP 工具來轉換您的文件︰


> java org.apache.fop.apps.Fop simple.fo simple.pdf

恭喜您﹗您已經從 XSL 格式化物件建立出了您的第一個 PDF 文件﹗如果您想要立即進行測試,可以向 元素加入更多元素。試著加入 bold)和 monospaced)格式化物件以使 PDF 文件如下圖所示︰

現在您已準備好學習關於用 XSL-FO 來格式化文件的更多知識。

基本純文字格式化

基本區塊格式化

既然您已經接觸到了 元素的一些基本知識,您可以研究它們的更多屬性以及用純文字區塊可以做的其它一些事情。讓我們首先看看上一章中介紹的



  This is a paragraph of text.  Notice that as 
  this meaningless 
  prose drones on and on, the FOP 
  software automatically calculates line breaks for us.  
  Isn't that fascinating?


該範例使用 line-height 屬性來變更行間距。如果不使用該屬性,line-height 會和 font-size 相同。使 line-heightfont-size 大 3 到 6 個點通常是好的做法;如果行與行之間沒有小的空間,純文字可能會難以辨認和閱讀。所需的空間大小取決於字體的特性和純文字列寬;如果您正與團隊中的圖形設計師一起工作,那麼請遵循您的這位專家對該值的建議。

元素進行純文字格式化

下面介紹如何用 XSL-FO 元素來格式化純文字︰

  • 粗體字︰使用帶 font-weight="bold" 屬性的 元素。
  • 斜體字︰使用帶 font-style="italic" 屬性的 元素。
  • 等寬字︰使用帶 font-family="monospace" 屬性的 元素。
  • 變更字體︰要採用 serif 字體(通常類似於 Times-Roman),可使用帶 font-family="serif" 屬性的 元素。要採用 sans serif 字體(通常類似於 Arial),可使用屬性 font-family="sans-serif"(請參閱 FOP 文件以瞭解如何將機器上安裝的字體轉換為 FOP 可以使用的字體)。

關於特性的一句話

即使簡單的 XSL-FO 文件也會用到幾個特性,如 font-sizeline-heightfont-style。許多 XSL-FO 特性與您可能知道的 CSS 特性相同。XSL-FO 和 CSS 還有共同之處︰即元素常常從其祖先元素繼承特性。下面還是那個範例段落︰


    
      
        This is a paragraph of text.  Notice that as 
        this meaningless 
        prose drones on and on, the FOP 
        software automatically calculates line breaks for us.  
        Isn't that fascinating?
      
    

請注意,在定義 元素時,範例沒有指定 font-sizeline-height 特性。那是因為那些特性是從含有 元素的 元素繼承而來。

關於特性要記住的另一件事︰XSL-FO 特性祇是 XML 屬性。

您會注意到我在本教學課程中將特性(property)和屬性(attribute)互換使用。XSL-FO 規範也是這樣做的。

字元實體

以下是對於純文字格式化要記住的另一方面︰字元實體。不像 HTML,XSL-FO 沒有定義字元實體。這意味著每次您想使用字元實體時,必須自己定義它。下面是定義字元實體的語法︰



]>
 

該程式碼定義了一個實體,並將它與一個特定字元相結合(DOCTYPE 關鍵字後的第一個單字必須是文件根元素的名稱)。一旦您已經定義了字元實體,就可以在 XSL-FO 文件中使用它,就像您在 HTML 文件中所做的那樣。當您在本教學課程的後續部分“XSL 格式化物件(XSL Formatting Object,XSL-FO)進階技術”閱讀到無排序清單時,您將看到另一個在 XSL-FO 中使用字元實體的範例。

純文字區塊間距與對齊

純文字對齊

有兩個屬性用來定義區塊中純文字的對齊。text-align 屬性定義純文字行如何對齊,text-align-last 屬性讓您定義對區塊中最後一行純文字的特殊處理。兩個屬性可設定的值都是相同的︰startcenterendjustify。對於從左向右書寫的語言,text-align="start" 產生向靠左對齊的純文字,text-align="end" 產生靠右對齊的純文字。對於以其它方向書寫的語言,startend 有別的含義。

下面展示其中間的段落在 XSL-FO 中是什麼樣子︰



  Now is the time for all good men and women to come to the 
  aid of the party.  Every good boy deserves fudge.  The 
  quick brown fox jumped over the lazy dog.  Jackdaws love
  my big sphinx of quartz.  


區塊間距

有兩組屬性用來定義區塊之間應該有多大的間距(如果有間距的話)︰space-beforespace-after。您可以加入字尾 .minimum.maximum.optimum.precedence 來修改這些屬性。下表概括了使用這些屬性的一些範例格式化,並描述了字尾的效果︰

XSL-FO 範例 含義
在區塊開始之前留 14 點的垂直空間
在區塊開始之前留 14 點的垂直空間
在區塊開始之前至少留 6 點的垂直空間

XSL-FO 規範定義了當不同間距屬性相互衝突時,用於決定優先權的所有的特性和規則。在本教學課程中,範例通常指定非修改值並維持其原狀。

根據特性及其組成部分的不同組合,總共有 10 項選擇︰


space-before
space-before.minimum
space-before.maximum
space-before.optimum
space-before.precedence
space-after
space-after.minimum
space-after.maximum
space-after.optimum
space-after.precedence

在區塊內和區塊之間避免分隔

XSL-FO 規範定義了幾個特性,它們能提示顯示引擎如何使內容區塊區塊保持在一起。有三組這樣的特性︰keep-with-nextkeep-with-previouskeep-together。您可以將這些基本特性與 .within-line.within-column.within-page 這些組成部分結合使用。

下表展示了使用這些特性的一些範例格式化,並描述了它們的使用效果︰

XSL-FO 範例 含義
永遠將這一區塊與它之後的一區塊放在同一頁面上
永遠將這一區塊與它前面的一區塊放在一起
決不容許這一區塊中有分欄符號

space-beforespace-after 特性及其元件一樣,這裡也有許多組合︰


keep-with-next
keep-with-next.within-line
keep-with-next.within-column
keep-with-next.within-page
keep-with-previous
keep-with-previous.within-line
keep-with-previous.within-column
keep-with-previous.within-page
keep-together
keep-together.within-line
keep-together.within-column
keep-together.within-page

這些特性的有效值有 auto(它讓顯示程式來決定何時將行放在一起)和 always(它指明兩個區塊應永遠放在一起)。您還可以使用整數值;數字越大,特性的優先等級就越高(always 高於任何整數)。雖然介紹了這些內容,但要知道 FOP 並不總是能正確處理這些特性,所以不要期望它們每次都能發揮作用。

在區塊的前後放置分隔字元

XSL-FO 也有告訴顯示程式如何分隔區塊的屬性。break-before 屬性有五個值︰

下表概括了使用 元素的三種方法,並描述了每個範例的效果︰

特性值 值的作用
auto 讓顯示引擎自行處理
column 在這個區塊的前面放置分欄符號
page 在這個區塊的前面放置分頁符號
odd-page 顯示引擎插入一個分頁符號(或兩個,如有必要的話),以便這一區塊在奇數頁上開始。換句話說,如果一個分頁符號會使這個區塊在偶數頁上開始的話,FOP 會插入第二個分頁符號。
even-page 顯示引擎插入一個分頁符號(或兩個,如有必要的話),以便這一區塊在偶數頁上開始。

還有一個 break-after 屬性,它有五個相同的值,用來指定目前區塊之後的分隔字元。

widows 和 orphans

使行保持在一起的最後兩個控制特性是 orphanswidows 特性。widows 和 orphans 是被獨立顯示的段落開始或結尾處的單行或部分行,產生它們的原因是因為分頁符號或分欄符號不恰當的位置中斷了純文字區塊。在 FO 中,您可以指定某個區塊在分隔字元前後有多少行應放在一起。widows 特性定義了必須在頁面底部一起出現的最小行數;預設值是 2。orphans 特性定義必須在頁面頂部一起出現的最小行數。其預設值也是 2。

基本圖形

GIF 和 JPEG 圖形

要在 FO 文件中向 PDF 文件加入圖形,可使用 元素。以下是範例︰




您可以用這個元素在 PDF 文件中嵌入 GIF 和 JPEG 圖像。XSL-FO 規範還定義了 heightwidth 特性;這些元素能幫助 FOP 引擎計算圖形所需的空間。

最後一點說明︰ 元素在預設情況下不會引起換行。如果您希望圖形單獨出現,請將 放置在 中。

SVG 圖形

FOP 現在包括 Batik SVG 引擎(請參閱參考資料)以用於在 PDF 文件中顯示 SVG(Scalable Vector Graphics,可伸縮向量圖形)。如果圖形在外部文件中,您可以用 元素包括它。因為 SVG 是 XML 詞彙,所以您可以用 元素將 SVG 元素包括在 XSL-FO 文件本身中。下面展示了如何將一個表示紅色方塊的 SVG 圖形嵌入到 XSL-FO 文件中︰



  
    
      
    
  


如果您希望從原始資料直接產生 SVG,可以建立一個樣式表,用該樣式表建立 XSL-FO 元素和 SVG 元素。這兩者都將隨後由 FOP 引擎處理。

繪製線

XSL-FO 規範還定義了一個 元素,以在文件中繪製線。通常在以下三種情況中使用它︰在文件各章節之間繪製分隔線(很像 HTML


元素),為填空式表單繪製線,以及在目錄中標題和頁數之間繪製虛線。

下表概括了使用 元素的三種方式,並描述了每個範例的效果︰

“FO leader”範例 結果


  


與目前列寬等長的水平線


  


長度為 100 點的水平線


  


與目前列寬等長的水平虛線

leader-pattern 特性的有效值有 spaceruledots。預設值為 space,表示 元素只有只有建立空格。XSL-FO 規範定義了另一個值 use-content,但 FOP 不支援它。

據我所知,無法向區塊加入垂直的直線;您必須用 SVG 來做到那一點。

結語

既然您已經瞭解了區塊、內建元素和圖形,那麼 這個文件就值得一看。它含有各種純文字格式化、外部圖形和一個內建 SVG 圖形。頁面的各節之間還有線。下面是從該文件產生的 PDF 文件的片段︰

您也可以檢視 PDF 文件以檢視整個結果。

參考資料

  • 研讀 W3C 網站(w3.org/TR/xsl)上的 XSL-FO 規範(總共 400 頁)。
  • 有關 XSL-FO 的更多一般訊息,請存取位於 w3.org/style/xsl/ 的 W3C Style 頁面。
  • 請下載 Xalan,這是在本教學課程範例中使用的 XSLT 處理器,它來自 Apache XML 專案 http://xml.apache.org/xalan-j/index.html。
  • 本教學課程中的範例適用於 FOP 版本 0.20.4,該版本於 2002 年 7 月 5 日發布。從 xml.apache.org/dist/fop 下載 Apache XML 專案的 FOP 套裝軟體。
  • 在 http://xml.apache.org/batik/ 找到有關 Batik SVG 引擎的更多訊息,以便在 PDF 文件中顯示 SVG(可伸縮向量圖形)。Batik 包括在用於本教學課程的這一版本 FOP 中。
  • Nicholas Chase 的教學課程“Introduction to Scalable Vector Graphics”是學習 SVG 基礎知識的好地方(developerWorks,2002 年 2 月)。
  • 要瞭解 XSL-FO 的另一個應用程式,請查閱 Rodolfo Raya 為 developerWorks 寫的文章“Using XSL-FO to create printable documents”。這篇文章說明了作者如何使用 XSL-FO 從 Java 語言應用程式產生可列印資料庫報表(developerWorks,2001 年 11 月)。
  • 在 developerWorks XML 專區找到關於本教學課程所介紹技術的更多訊息。
  • IBM WebSphere Studio 提供了一套使用 Java 和其它語言來使 XML 開發自動化的工具。它與 WebSphere Application Server 緊密整合,但也可與其它 J2EE 伺服器一起使用。
  • 瞭解如何成為 XML 和相關技術的 IBM 認證開發人員。

關於作者

Doug Tidwell 是 developerWorks 網路技術傳教士,幫助人們使用新技術來解決問題。他已經為全世界數萬開發人員講解過 Web 服務和 XML,並確實令其中的許多人受到啟發。他還是 O'Reilly XSLT 的作者,以及 O'Reilly Programming Web Services with SOAP 的合著者,這兩本書都是推薦給您親朋好友的絕佳禮物。

可以透過 [email protected] 與他連絡。

你可能感兴趣的:(XSL 格式化物件(XSL-FO)基礎知識)