在 MS Windows 下建立 DocBook 的解譯環境

来源:互联网 发布:美工设计精灵工作室 编辑:程序博客网 时间:2024/05/01 02:57

写在最前面的:
由于本文遵守GUN版权协议,所以完全可以将其以原创来在此发布,由于对原作者的尊敬,还是保留了相关的作者信息。另外对于本文相关的几篇文章还是推荐读者再看看:
DocBook官方手册SGML FOR NT
。之所以推荐此文,也是经过本机测试过的,由于部分版本号的问题,读者稍加改动便可以。而且,错误信息定位的很准确,相信这点问题不会难倒大家的,另外为了不影响您的阅读习惯,我在可能有问题的地方附近用红字体或者高亮字体标记出来,特此注意。

文章连接:http://blog.csdn.net/thefirstwind/archive/2006/12/21/1451714.aspx
原文连接:http://www.study-area.org/tips/doconwin/doconwin.htm

在 MS Windows 下建立 DocBook 的解譯環境

老貢生老貢生

聯絡人
台灣企鵝寶寶工作隊

oldgen@pchome.com.tw

Revision History Revision 1.0 2004-04-02   第一次對外公佈

文件主旨

本文將介紹如何在 MS Windows 下安裝從 Unix Like 系統移植過來的軟體工具,使得 DocBook 格式文件一樣可以像在自由開放的作業系統下,被編譯及轉換輸出。你不需要懂得 Linux,FreeBSD or Unix 才能操作 DocBook ,從文件編寫,檢測到轉換成可閱覽格式,就在你熟悉的 MS Windows 下,以你習慣的操作方式。

版權宣告

本文採用 GNU 組織的 GPL公開版權宣告,歡迎複製,改寫,散佈,並要求你應該以同樣的權利條款,授予文件的使用人。對 GPL 的進一步的解釋,請參考 GNU 通用公共許可證 。


Table of Contents
1. 作者序
2. 前言
3. DocBook 檔案目錄的規劃
4. 系統的環境變數設定
4.1. MS Win95/98 的環境變數設定
4.2. MS WinMe/2000 的環境變數設定
5. 建立 SGML 定義的解譯環境
5.1. 安裝 OpenJade For MS Windows
5.2. 安裝 DocBook 的 DTD 定義模組
5.3. 安裝 DocBook 的 DSSSL 樣式表
5.4. 安裝 ISO 特殊字元實體宣告模組
5.5. 撰寫本機適用的 SGML CATALOG 檔
6. DocBook SGML 文件解譯實作
6.1. 製作一份 DocBook SGML 測試文件
6.2. 啟動解譯功能及命令參數解釋
7. 建立 XML 定義的解譯環境
7.1. 安裝 for MS Windows 的 XML 解譯器
7.2. 安裝 DocBook 的 DTD 定義模組
7.3. 安裝 DocBook 的 XSL 樣式表
7.4. 安裝 ISO 特殊字元實體宣告模組
7.5. 撰寫本機適用的 XML CATALOG 檔
8. DocBook XML 文件解譯實作
8.1. 製作一份 DocBook XML 測試文件
8.2. 解譯 DocBook XML 文件
9. 結語
A. 附錄
A.1. 參考文件
A.2. 下載連結

1. 作者序

最初接觸 DocBook 只是一個很單純的想法,那就是為我的工作團隊尋找一個共同處理,編輯,交換文件的方法。由於我的工作團隊組成複雜,每個人使用的處理機器,作業平台,應用軟體,都有極大的差異,導致對一些圖文顯示,排版控制的標準,該採用何種格式文件而爭論不休。

DocBook 的跨平台可交換性,以及資料與版面顯示分離的處理,似乎為許多有這方面處理困擾的工作團隊,展示了一個初步解決的方法。但是,如何讓已建立好,或已取得的 DocBook 文件,在不同的作業平台下,被轉換成我們希望能進一步閱讀或列印的格式,就成了最大的挑戰。

這個挑戰,隨著 Unix like 作業系統的自由軟體工作者,不斷的去嘗試開發符合 SGML 或 XML 語法規則的解譯工具程式及軟體模組,而獲得了解決,並進一步的推展其功能。但在 MS Windows 作業系統下,則沒有相對應,功能足夠的,非商業化的自由或共享軟體,來作為 DocBook 的解析器與轉換器。只能製作 DocBook 文件,卻無法在 MS Windows 下轉換成其他格式,不能不說是我對 DocBook 這種以跨平台為理想的格式文件,一個美中不足的缺憾。

2004 年春季,我在網路搜尋到 Markus Hoenicka 的 SGML for NT 網頁,他介紹了許多努力想把開放軟體從 Unix Like 的作業系統移到 MS Windows 的團體,及他們的工作成果。此外 Markus 也示範了如何用這些已開發完成的 For MS Windows 的工具,來建立在 MS Windows 系統之下的 DocBook 解譯環境。因此,我豁然開朗,也完成了對於 DocBook 翻譯行動的最後一個心願,和一個可以作為句點的最後努力。

我的這篇文章,不過拾 Markus Hoenicka 君的部份牙慧而已,如果你看完本文要有所感謝的話,應該感謝 Markus Hoenicka,以及所有移植軟體工具的開發團隊,包括負責開發 SGML 解譯器的 OpenJade 專案團隊 ,努力移植 XML 解譯程式的 Zlatkovic 這個私人組織,以及其他從不同方面,想把自由空氣,吹進 MS 這個封閉王國的人。我沒有發現或提供什麼,我只是紀錄這些人的卓越表現,傳述給你知道而已。


2. 前言

DocBook 不管如何的在 Unix like 的開放作業系統中,縱橫開闔,如果依然無法在目前最多使用人口的 MS Windows 系統下編譯轉換,無疑辜負了作為一個跨平台文件格式當初設計的目的,而成為美中不足的遺憾。所幸,經由一些開放作業系統社群的使用者,嘗試著把一些 Unix Like 系統下的 DocBook 解譯工具的原碼,移植修改,並在 MS Windows 下編譯成執行檔後,終於使得 MS Windows 也有了非商業的,自由的 DocBook 軟體工具。本文將介紹如何在 MS Windows 下安裝從 Unix Like 系統移植過來的軟體工具,使得 DocBook 格式文件一樣可以像在自由開放的作業系統下,被編譯及轉換輸出。你不需要懂得 Linux,FreeBSD or Unix 才能操作 DocBook ,從文件編寫,檢測到轉換成可閱覽格式,就在你熟悉的 MS Windows 下,以你習慣的操作方式。

在 MS Windows 系統下執行 Unix Like 的軟體工具,主要有下列方式:

 

cygwin 模組

cygwin 是 Linux 的套件發行商 Red Hat ,為了順利的把 Linux 上發展的應用工具軟體,移植到 MS Windows 中執行,所發展的一整組程式模組。它以 cygwin1.dll 為模擬層,來在 MS Windows 下模擬出一種類似 Unix 的執行環境,然後再加上各種系統及應用工具組,就能讓你在 MS Windows 中規劃出一個 Unix Like 的虛擬空間,使你能很方便的延續原來的 Unix 操作習慣。

單獨程式

相較於 cygwin 的模擬出整個 Unix 的虛擬空間,使你雖然身在 MS Windows 之中,卻有如使用 Unix Like 作業系統一般;單獨的程式檔案則是把某種 Unix 下工具的原碼,從新依照 MS Windows 的系統規格加以改寫後,再在 MS Windows 下重編譯成執行檔。這種方式做出來的工具,只有他的命令或操作方式保有原來的風格,操作者的一般使用習慣,仍是使用他原來的 MS 模式。

雖然大多數的說明文件作者會建議你使用 cygwin 的方式,因為可以維持工具程式原來的操作習慣,以及功能便利性上,確實較 MS Windows 完整,但先決條件是:你必須熟悉 Unix 的系統規劃和操作習慣。本文的目的不是向你推廣自由開放的作業系統,更不會拿 DocBook 編譯當誘餌,引導你去接受另一種模式。因此,本文介紹第二種單獨程式的方式,那就是你還是維持你原來的系統操作習慣,只是在使用轉譯工具時,注意一下工具程式的執行環境和命令格式而已。

此外,在 Linux 下的 DocBook 文件工具,可分為寫作工具組和轉譯工具組。一般是推薦使用鼎鼎大名的 Unix 文字編輯器 Emacs,因為他可以藉由 plug-in 的方式來支援 DocBook 各種分類標籤的自動輸入。問題是 Emacs 雖然功能強大繁多,但如果你不熟悉它的用法,根本無法領會他的操作方式,所以從來沒有接觸過 Emacs 的是否有必要為了寫份 DocBook ,就要大費時日的學習 Emacs ?實在有待商榷。其實 DocBook 文件寫作工具可以陽春到 MS Windows 下的 wordpad.exe or notepad.exe 就好,就算不加裝任何的其他編輯工具,也能勝任愉快,只不過標籤要一個一個自己慢慢打字比較累而已。此外或許你有在 MS Windows 更棒的格式文件寫作軟體,那又何必畫蛇添足,強塞 Emacs 到系統裡呢?基於這個考慮,本文不介紹 DocBook 的編輯器工具[1] ,由你自己去選擇喜歡而熟悉的工具來編輯 DocBook。而把重點放在如何解析轉換製作好的 DocBook 文件,成為另一種方便閱覽的輸出格式文件上。

最後要提及的是雖然 DocBook 可以轉換成 HTML,RTF,Tex 各種格式文件,但除了 HTML ,一般都有瀏覽器支援外,其他的瀏覽器就不是那麼普遍而需要另外安裝。為了簡化問題,本文只介紹 DocBook 到 HTML 的轉換,至於轉成 HTML 後,支援的格式轉換器就多了,甚至你可以在 MS Office Word 裡讀入 HTML ,再轉成所有 Word 的支援格式。

不管是前面提到的 cygwin,Emacs 安裝,以及其他 DocBook 轉換成 rtf,tex 格式的方法,在 SGML for NT homepage 可以找到完整的原文說明。下面就開始介紹如何在 MS Windows 下安裝 DocBook 解譯器,相關組件,以及系統環境佈置;由於 DocBook 可以分別被 SGML 和 XML 規格的解析器轉譯,所以下面將分別就 SGML 和 XML 分節說明其不同的方法,你可以依自己的需要選看,或者為求全面的了解,而通通試驗一遍。


3. DocBook 檔案目錄的規劃

為了放置相關的 DocBook 程式工具及相關的模組檔案,建議使用你熟悉方式,在 MS Windows 系統製作下列目錄:

 

C:/unix

本文將把所有 DocBook 有關的檔案都放在 unix 及其子目錄下,也就是把 unix 當 DocBook 工具組的根目錄。C: 是你 MS Windows 系統所在的磁碟機代號,如果你的 MS Windows 不在 C ,請把本路徑改成相對應的磁碟機代號。

C:/unix/etc/sgml

一般在 Unix 上,本機的組態設定多在 etc 路徑內,所以我們也製作 etc/sgml 這樣的目錄,來擺放你這台機器的 SGML 組態設定。

C:/unix/usr/bin

這個目錄我們將擺放 DocBook 解譯的執行程式檔案。

C:/unix/usr/lib

這個目錄我們將擺放 DocBook 解譯的動態呼叫函式庫。

C:/unix/usr/include

這個目錄我們將擺放一些程式原碼編寫時會用到的標頭檔。

C:/unix/usr/share/sgml

有關 SGML 語言,可供共同利用的各種非程式或函式庫的模組檔案放置處。

C:/unix/usr/share/sgml/docbook

有關 DocBook 格式文件,可供共同利用的各種非程式或函式庫的模組檔案放置處。

C:/unix/usr/share/sgml/jade-dsssl

OpenJade 提供的 DSSSL 樣式表的基本定義模組檔案放置目錄,不管你為某種特殊的 SGML 格式文件設計多少不同樣貌的樣式表,DSSSL 基本定義模組檔案是每一份樣式表都不可或缺的那部分,沒有它們,你的樣式表不可能成為一份合法的 SGML 定義文件。

C:/unix/usr/share/sgml/isoent

協助 SGML 跨平台傳遞資料,ISO 組織制定的特殊字元實體宣告模組放置目錄。

C:/unix/usr/src

我們可以把網路下載來的 Unix 工具壓縮包放這裡。

C:/unix/opt

這裡放解壓縮後的各種模組檔案。

 

 

在製作 DocBook 目錄結構時有一個觀念很重要,那就是 MS Windows 檔案長檔名中使用空白字元,如 "Program Files" 或者 "Documents and Seting" 這種目錄名稱,只有在圖形介面,用滑鼠雙擊啟動才會正確,如果使用命令模式,就會誤判成分別的命令參數。DocBook 解譯器需要使用命令模式,無法用滑鼠取代,所以以一定不要把各種 DocBook 檔案放在中間有空白字元的檔案路徑中。如果你堅持喜歡有 MS 的味道,也該用 "Programs" 取代 "Program Files",或是 "DocAndSet" 取代 "Documents and Seting" ,千萬不要在目錄和檔案名稱中有空白字元。


4. 系統的環境變數設定

不管是那種作業系統,都會使用環境變數來傳遞附加訊息給執行的工具程式。最有名的就是 PATH 這個路徑變數了,他告訴作業系統的命令器,在那些路徑下能找到執行程式及相關函式庫,避免全硬碟搜尋,加快執行速度。

可不要以為只要我不怕麻煩,下命令時把指令的完整路徑打出來,就可以不需要 PATH 環境變數。要知道現在的程式很少是單獨一個的存在,他們都會在啟動時去呼叫其他相關的函式庫來一起工作,那麼你不設定 PATH 變數,作業系統是找不到相關檔案的。所以,PATH 這個環境變數,是執行 DocBook 首先要設定的。

此外 OpenJade 工具程式組[2]在執行時,需要 SGML_CATALOG_FILES 這個環境變數來指示他那裡可以找到系統的 DocBook 相關定義模組檔的位置紀錄 catalog(catalog 檔案的作用將在後面章節說明),因此 SGML_CATALOG_FILES 是我們必須設定的第二個環境變數。

由於 MS Win95/Win98 和 MS Win2000/WinMe 的環境變數設定方式不一樣,因此我把兩者的方式都介紹一下。


4.1. MS Win95/98 的環境變數設定

MS Win95/98 的環境變數是要在 Dos 的批次檔中設定的,為了一開機就讓我們的變數設定產生作用,我們應該編輯 C:/autoexec.bat [3]這個 Dos 開機批次檔,並插入下列敘述:

SET PATH=C:/unix/usr/bin;C:/unix/usr/lib;%PATH%
SET SGML_CATALOG_FILES=./catalog;C:/unix/etc/sgml/catalog

下面我們將分析這些環境變數內容的意義:

 

  • 我們會在後面把 DocBook 的程式工具放在 C:/unix/usr/bin 路徑,而把相關函式庫放 C:/unix/usr/lib ,因此設定 PATH 環境變數要包含這兩個搜尋路徑。

  • DocBook 格式文件會把 DTD 文件定義檔案模組,Stylesheet 樣式表檔案模組,以及實體宣告的檔案模組,各自獨立分開成不同的檔案,而可以供不同的 DocBook 文件重複利用。所以你必需要以 catalog 這個檔案通知 DocBook 解譯器,在你的系統中,這些 DocBook 執行編譯時的相關檔案在那些路徑上。SGML_CATALOG_FILES 就是告訴解譯器,這個指明檔案路徑位址的紀錄檔 catalog 在那裡。"./catalog" 是表示如果現路徑有 catalog 檔,就以現路徑 catalog 為準,如果沒有,則以 C:/unix/etc/sgml/catalog 的系統預設的 catalog 檔為準。


4.2. MS WinMe/2000 的環境變數設定

在 MS WinMe/2000 裡,原來 DOS 的系統設定檔 config.sys 及 autoexec.bat 都被廢棄不用,而以系統登錄資料取代之。下面說明如何在 MS Windows 登錄資訊中加入相關的環境變數設定值:

 

  1. 在 MS Windows 開始主選單選擇 [執行(R)] 。

  2. 在 [開啟(O)] 輸入欄中輸入 regedit 或 regedt32 來啟動登錄資訊編輯器。

  3. 登錄資訊編輯器展開後,展開 [HKEY_CURRENT_USER] 這個機碼的樹狀路徑。

  4. 選擇 [Enviroment] 機碼,並展開其資料於右邊視窗。

  5. 如果是 regedit :

     

    1. 選擇登錄程式上方的 [編輯(E)/新增(N)/字串值(S)] 後,在右邊視窗會出現 [新數值 #1] 的新項目。

    2. 選擇 [新數值 #1] ,按功能表 [編輯(E)/更名(R)] ,把新數值 #1 改為 PATH。

    3. 選擇 [PATH] ,按功能表 [編輯(E)/修改(M)] ,在輸入盒 [值的資料] 欄輸入 C:/unix/usr/bin;C:/unix/usr/lib;%PATH%。

    4. 以上列同樣的方式加入字串值 SGML_CATALOG_FILES ,[值的資料] 是 ./catalog;C:/unix/etc/sgml/catalog。

     

  6. 如果是 regedt32 :

     

    1. 選擇登錄程式上方的 [編輯(E)/新增值(V)] 後,會出現一個新增值輸入盒,在[值的名稱(V)] 填 PATH,[資料類型(D)] 依預設選 REG_SZ 。

    2. 前一新增值輸入盒按確定後,就會跑出個字串編輯器,在 [字串(S)] 中輸入C:/unix/usr/bin;C:/unix/usr/lib;%PATH%。

    3. 依前述同樣的方式新增值 SGML_CATALOG_FILES ,字串值是 ./catalog;C:/unix/etc/sgml/catalog。

     

當所需的環境變數都設定妥當,將電腦重開機即可發生效用(只要注销以下就可以了)。你可以開啟 [Dos 命令視窗] 或 [C:/ 命令提示字元] ,鍵入 set 命令,檢查一下(set  SGML_CATALOG_FILES)。如果有:

......
PATH=......c:/unix/usr/bin;c:/unix/usr/lib;......
SGML_CATALOG_FILES=./catalog;C:/unix/etc/sgml/catalog
......

就表示設定正確,也就可以開始去抓 DocBook 解譯的相關檔案前來 MS Windows 安裝了。


5. 建立 SGML 定義的解譯環境

DocBook 格式最早是用 SGML 語法定義,其後再轉成用 XML 語法再定義一次。所以使用 SGML 解譯工具來解譯 DocBook 格式文件,可以說是最正統的作法。我們要在 MS Windows 下建立 DocBook 的 SGML 語法解譯環境,應該分為下列幾個主要部份:

 

  1. 安裝 DocBook 的 For MS Windows 解譯器。

  2. 安裝 DocBook 的 DTD 檔案模組。

  3. 安裝 DocBook 的 DSSSL 樣式表。

  4. 安裝 ISO 組織發佈的特殊字元實體宣告檔案模組。

  5. 寫一個適合你自己機器使用的 SGML catalog 檔案。

現在我們就針對這些部分分別說明:


5.1. 安裝 OpenJade For MS Windows

OpenJade 是一個符合 SGML 語言定義的解譯器,在 Unix Like 的作業系統下,它分為 OpenSP 和 OpenJade 兩大部分。OpenSP 負責檢查我們寫作的 SGML 文件是否合法,並將各種宣告代名替換成真正的設定值,拼合成一份完整的文件。OpenJade 則是把經過 OpenSP 整理後的 SGML 文件,依照我們指定的樣式表,作其他閱讀或列印格式的輸出。也就是說沒有 OpenJade 工具組,你縱使有 DocBook 文件,也無法做有效的利用,所以,當然先要網路下載 OpenJade ,來裝在我們的 MS Windows 系統中了。

OpenJade 前後發展了許多版本,但多半是 for Unix Like 的,for MS Windows 的只有openjade-1.3-1.exe 這個版本。openjade-1.3-1.exe 包含了 OpenSP 和 Openjade 兩部分,所以不必擔心會有所疏漏,你可以在 http://prdownloads.sourceforge.net/openjade/openjade-1.3-1.exe?download 的 URL 位址下載,然後把這個檔案放到 C:/unix/usr/src 目錄,準備安裝。

當檔案下載完畢,你可以從檔案總管雙擊 openjade-1.3-1.exe 來啟動安裝程序。當安裝程序進入安裝目的路徑選擇時,請注意,一定不要使用預設的 C:/Programs Files/OpenJade-1.3 目錄,你可以聽從本文的建議,把安裝路徑設為 C:/unix/opt/OpenJade-1.3,其他遵照安裝指示辦理即可。

當 OpenJade 安裝完畢後,並不會在 MS Windwos 的功能表或桌面放什麼啟動的快捷鍵,它只是在把一些檔案在 C:/unix/opt/OpenJade-1.3 目錄下解開而已。為了要讓 OpenJade 真能發揮作用,我們必須做下列動作:

 

  • 把 C:/unix/opt/openjade-1.3/bin/ 路徑下所有副檔名 exe 的執行程式複製到 PATH 的 C:/unix/usr/bin 統一搜尋路徑下。

  • 把 C:/unix/opt/openjade-1.3/bin/ 路徑下所有副檔名 dll 的動態函式庫複製到 PATH 的 C:/unix/usr/lib 統一搜尋路徑下。

  • 把 C:/unix/opt/openjade-1.3/dsssl/ 路徑下所有的檔案複製到 C:/unix/usr/share/sgml/jade-dsssl,以供所有的 SGML 文件解譯轉換使用。

當你做完以上步驟,OpenJade 解譯器已經可以開始執行 SGML 的解析和轉換了。下面我們將製作一些簡單的 SGML 格式文件,來測試我們是否已把 OpenJade 裝置妥當。


5.1.1. 製作測試文件及文件格式解析

要測試我們的 SGML 解析器管不管用,當然是要給他份 SGML 文件來試試,請你將下面範例複製後,貼製成 check.sgm [4]文件。

Example 1. SGML 格式測試文件

<!DOCTYPE HTMLLite [
  <!ELEMENT HTMLLite O O (H1|P)* >
  <!ELEMENT (H1|P) - - (#PCDATA|EM|STRONG)* >
  <!ELEMENT (EM|STRONG) - - (#PCDATA) >
]>
<HTMLLite>
  <H1>SGML 解析器測試文件</H1>
  <P>這是一個簡短的,合乎 SGML 語言規格定義的簡短文件,本文製作的目的就是希望
     藉由一個合法的文件,來檢測你的 SGML 規格解譯器能否順利運作。</P>
  <P>我們推薦你使用 <STRONG>jade</STRONG> or <STRONG>openjade</STRONG> 解譯
     模組來測試本文件,你可以用 OpenSP 裡的 <EM>onsgmls</EM> 工具程式測試
     本文件是否合乎法定格式,或用 <EM>openjade</EM> 工具程式測試是否能順利依
     DSSSL 樣式表設定執行文件格式轉換功能。</P>
  <P>本文件採用 GPL 版權宣告,歡迎轉載、改寫、散播。</P>
</HTMLLite>

開啟 Dos 命令視窗後,切換到 check.sgm 檔的同一目錄下,你可以使用下面的指令:

onsgmls -s check.sgm

如果執行後什麼顯示訊息都沒有,那就表示文件完全合法,也表示 OpenSP 部分是 OK 的,其他任何訊息出現,就表示某部分出了問題。至於參數 -s 是表示只顯示錯誤訊息,如果沒有加 -s 參數,onsgmls 會把解析過的字串顯示到監視器上。由於錯誤訊息和大量解析字串一起出現,不易觀察,才加 -s 參數,你也可以試著不加 -s 參數看顯示結果。


5.1.2. 轉換輸出格式功能測試

通常的 SGML 格式文件,適合用來作文件的資料分類和整理,但卻未必適合讀者直接閱讀,所以要將 SGML 文件給讀者直接在螢幕上瀏覽,或者交付機器列印前,會作一次文件格式的轉換。如何轉換?要轉成什麼樣子?就交給樣式表來決定。前面文件格式剖析的部分,已交由 OpenSP 部分的 onsgmls 這個解析器執行了,接著我們要使用 OpenJade 部分來測試輸出格式轉譯的問題。當然,格式轉譯少不了樣式表,下面就請把範例貼成 check.dsl ,和 check.sgm 放同一目錄下:

Example 2. check.dsl 適用的 DSSSL 樣式表

<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN">
<style-sheet>
  <style-specification>
    <style-specification-body>

      (element HTMLlite (make simple-page-sequence))

      (element H1
      (make paragraph
      font-family-name: "Times New Roman"
      font-weight: 'bold
      font-size: 20pt
      line-spacing: 22pt
      space-before: 15pt
      space-after: 10pt
      start-indent: 6pt
      first-line-start-indent: -6pt
      quadding: 'center
      keep-with-next?: #t))

      (element P
      (make paragraph
      font-family-name: "Times New Roman"
      font-size: 12pt
      line-spacing: 13.2pt
      space-before: 6pt
      start-indent: 6pt
      quadding: 'start))

      (element EM
      (make sequence
      font-posture: 'italic))

      (element STRONG
      (make sequence
      font-weight: 'bold))
    </style-specification-body>
  </style-specification>
</style-sheet>

開啟 Dos 命令視窗,執行下列指令:

openjade -t rtf -d check.dsl -c C:/unix/usr/share/sgml/jade-dsssl/catalog -o output.rtf check.sgm

這樣就可以看到新產生一個 output.rtf 檔,你用 wordpad 開啟這個檔案,就可以發覺它的確是個標準的 RTF 文件檔。

接著我稍微解釋一下這些參數的涵義:

 

-t rtf

-t 參數表輸出格式指定,此處是指定適用於 MS Windows 的 RTF 格式文件檔。

-d check.dsl

-d 參數表輸出樣式表指定,同樣一份 SGML 文件,可以因為使用不同的樣式表,而輸出成不同樣貌的格式文件,check.dsl 是我們剛剛範例製作的樣式表。

-c C:/unix/usr/share/sgml/jade-dsssl/catalog

DSSSL 樣式表也是一種 SGML 格式文件,所以系統必須提供他必須的 DTD 定義資料,我們在安裝 OpenJade 時,安裝程式也包裹了一份樣式表要運作的基本模組檔案,在 dsssl 路徑中,並以 catalog 檔指明各模組所在,所以我們以 -c 參數指示 OpenJade ,要以 usr/share/sgml/jade-dsssl/catalog 檔案作為此次 OpenJade 轉譯的的資源索引檔。

-o output.rtf

-o 參數指明輸出檔案的名稱。

check.sgm

此次資料來源檔案名稱。

 

 

當我們使用 OpenJade 作輸出格式轉換時,openjade 內部會如同 onsgmls 程式一般,先呼叫 OpenSP 功能組對來源文件作解析及整理,再把整理過的資料流交給 Openjade ,依照樣式表規定,轉換成相對應的資料格式。所以執行 openjade 是少不了 onsgmls 這些其他的工具組的。


5.2. 安裝 DocBook 的 DTD 定義模組

OpenJade 是個通用型的解譯器,各種合乎 SGML 語法定義的格式文件,都可以使用 OpenJade ,它並不是 DocBook 專屬的。但 DocBook 可不像我們前面舉的那個測試文件 check.sgm ,五個標籤直接寫在文件的前置區就解決,光是定義全部文件規則定義的 DocBook 模組檔案容量就有 300 多 kb ,比絕大多數我們撰寫的主文件內容都要大得多,所以當然不能加在每份文件上帶著跑。因此在處理 DocBook 這種大型 SGML 文件上,我們把文件主體和文件定義作分開處理,在每一台需要使用到 DocBook 文件的主機上,只留一份 DTD 檔案模組,而傳送編輯時,只傳送我們個別作者編寫的部分。也就是說你在網路上拿到的 DocBook 格式文件,都是只包含作者自己編輯的這部分,真正這份文件的規格定義,你必須到另外的官方網站下載,並在你自己的機器中留存一份。

DocBook 之所以成為如此風格特色的文件,當然是由 SGML DTD 模組定義出來的,我們要解譯 DocBook 文件,也必須告訴 OpenJade 工具程式,這份 DocBook 文件的 DTD 模組檔案何在?因此首先,我們要到 DocBook 的官方網站,把 DocBook 的 DTD 模組包裹下載,裝一份在我們的機器上。

DocBook 各模組最權威的發佈處應該是 http://www.oasis-open.org/docbook/sgml ,你可以在該處找到各個版本的 DocBook DTD 模組套件。由於 DocBook 各版本的 DTD 定義經過很多改變,所以除非你手上有那種 1.0 or 2.0 的 DocBook 文件需要解譯,否則不需要通通下載,如果是自己準備作一份 DocBook 文件,還是選比較新版本的 DTD 比較好。下面我們就以下載 Docbook DTD 4.2 版的 docbook-4.2.zip 這個 zip archive 為例,解說一下如何把它安置在我們的 MS Windows 系統中:

 

  • 到 http://www.oasis-open.org/docbook/sgml 位址,選擇 DocBook V4.2 連結,跳到 V4.2 頁面後選擇上方的 zip archive 連結,把 docbook-4.2.zip 這個壓縮檔下載到 C:/unix/usr/src 目錄下。

  • 在 C:/unix/usr/share/sgml/docbook 目錄下,作個 sgml-dtd-42 的子目錄,開啟 C:/unix/usr/src/docbook-4.2.zip 檔,將其解壓縮到 sgml-dtd-42 的目錄。

  • 用文字編輯器將 C:/unix/usr/share/sgml/docbook/sgml-dtd-42/docbook.cat 這個檔案開啟,搜尋文件中是否有 "DTDDECL" 字串的敘述[5],如果有,請將該行整行刪除,因為 openjade-1.3 for MS Windows 不支援 DTDDECL 敘述。改好後,不要執行存檔,而是應該將它另存新檔於同目錄下,檔名改為 catalog ,以作為系統搜尋指引之用。

經過上面步驟,我們就裝好了本文發布時,DocBook 官方推薦最近版本的 DTD 模組檔案,並且製作了 DTD 的 catalog 索引檔。如果你需要其他版本的 DocBook SGML DTD 模組,也請依同樣的方法一一安裝,不過不要忘了,你應該在 C:/unix/usr/share/sgml/docbook 目錄下為不同版本 DTD 做不同的子目錄,不可以和 V4.2 放在同一個 sgml-dtd-42 裡,你可以用 sgml-dtd-41 裝 V4.1 版,sgml-dtd-40 裝 V4.0 版......,依此類推。


5.3. 安裝 DocBook 的 DSSSL 樣式表

DocBook 的 DTD 檔案模組,只是為 DocBook 建立組織架構而已,至於這樣的一份組織架構資料,要如何轉成其他閱覽和列印格式,在 DocBook 的本文及 DTD 模組內並沒有答案。SGML 規範中,把這一部份交給了 DSSSL 樣式表,也就是想要 DocBook 輸出成什麼樣式,你就要寫怎樣的樣式表。不會寫?沒關係,那東西複雜到沒幾個人會,所以 DocBook 文件格式推廣人員已經幫我們先寫好一些基本的輸出格式來給 DocBook 用,如果你沒有特殊的輸出格式需求,使用網路上現有的樣式表模組就很夠了。

現在在 DocBook 使用人口中最利用廣泛的,就是 Norman Walsh 為 DocBook 寫的 DSSSL ,我們可以到 http://sourceforge.net/project/showfiles.php?group_id=21935 處下載 docbook-dsssl-1.78.zip[6] ,然後存入 C:/unix/usr/src 目錄中。

開啟 C:/unix/usr/src/docbook-dsssl-1.78.zip ,解壓縮到 C:/unix/usr/share/sgml/docbook 路徑下,應該會產生 docbook-dsssl-1.78 的子目錄和目錄中的各式各樣文件。到 docbook-dsssl-1.78 下應該可以看到一個 catalog 檔案,表示 DSSSL 模組的目錄索引檔已經準備好,不需我們再多費手腳了。


5.4. 安裝 ISO 特殊字元實體宣告模組

電腦的發展並不是單一路線和規格,在不同的機型和作業系統發展時,使用了不少非 ASCII 定義字元,這些非標準字元在不同的作業平台下,不管是編碼或顯示狀況,都有所不同。為了這些特殊字元各系統編碼不同所可能產生的,不同系統的錯誤解譯,ISO 組織就配合 SGML 語法的實體(ENTITY)宣告,定義了各特殊字元的統一名稱,目的是可以再做解析轉譯成各系統適合的編碼。

DocBook 為了達成在不同平台傳遞的資料可攜性,當然也需要使用這些特殊字元宣告模組,只不過這些特殊字元模組是由 ISO 組織制定,而非 DocBook 委員會制定的,所以 DocBook DTD 裡沒有包括 ISO entities module 這部分,你可以另到 http://www.tldp.org/authors/tools/entities.tar.gz去下載這套模組,儲存於 C:/unix/usr/src 目錄下。

將 C:/unix/usr/src/entities.tar.gz 解壓縮到 C:/unix/usr/share/sgml/isoent 目錄下,這樣 isoent 下就有所有跨平台所需的特殊字元宣告檔案。但仍缺乏的是一個 SGML 的資源索引目錄檔 catalog ,所以請將下面的範例複製成純文字的 catalog 檔,置於 isoent 目錄下:

Example 3. ISO 特殊字元宣告 CATALOG 檔

  -- ...................................................................... --
  -- ISO entity sets ...................................................... --

PUBLIC "ISO 8879:1986//ENTITIES Diacritical Marks//EN" "ISOdia"
PUBLIC "ISO 8879:1986//ENTITIES Numeric and Special Graphic//EN" "ISOnum"
PUBLIC "ISO 8879:1986//ENTITIES Publishing//EN" "ISOpub"
PUBLIC "ISO 8879:1986//ENTITIES General Technical//EN" "ISOtech"
PUBLIC "ISO 8879:1986//ENTITIES Added Latin 1//EN" "ISOlat1"
PUBLIC "ISO 8879:1986//ENTITIES Added Latin 2//EN" "ISOlat2"
PUBLIC "ISO 8879:1986//ENTITIES Greek Letters//EN" "ISOgrk1"
PUBLIC "ISO 8879:1986//ENTITIES Monotoniko Greek//EN" "ISOgrk2"
PUBLIC "ISO 8879:1986//ENTITIES Greek Symbols//EN" "ISOgrk3"
PUBLIC "ISO 8879:1986//ENTITIES Alternative Greek Symbols//EN" "ISOgrk4"
PUBLIC "ISO 8879:1986//ENTITIES Added Math Symbols: Arrow Relations//EN" "ISOamsa"
PUBLIC "ISO 8879:1986//ENTITIES Added Math Symbols: Binary Operators//EN" "ISOamsb"
PUBLIC "ISO 8879:1986//ENTITIES Added Math Symbols: Delimiters//EN" "ISOamsc"
PUBLIC "ISO 8879:1986//ENTITIES Added Math Symbols: Negated Relations//EN" "ISOamsn"
PUBLIC "ISO 8879:1986//ENTITIES Added Math Symbols: Ordinary//EN" "ISOamso"
PUBLIC "ISO 8879:1986//ENTITIES Added Math Symbols: Relations//EN" "ISOamsr"
PUBLIC "ISO 8879:1986//ENTITIES Box and Line Drawing//EN" "ISObox"
PUBLIC "ISO 8879:1986//ENTITIES Russian Cyrillic//EN" "ISOcyr1"
PUBLIC "ISO 8879:1986//ENTITIES Non-Russian Cyrillic//EN" "ISOcyr2"

  -- ...................................................................... --

這樣,我們就完成了 ISO ENTITY 的安裝。


5.5. 撰寫本機適用的 SGML CATALOG 檔

經過前面幾個步驟,DocBook 編譯時所需要的的外部連結檔案,都已經在我們的 MS Windows 中安裝妥當,並且為每一種資源分配了一個索引檔 catalog 。但為了不必每次使用 openjade 命令參數,都要輸入一長串參數,我們應該用一個總的 SGML CATALOG FILE 把所有的各部分 catalog 串起來。所以如果你一路下來都照本文的方法安裝各部分,那麼下面的範例可以把它複製成 catalog 檔案,置於 C:/unix/etc/sgml 目錄下,由於我們前面有做過系統的 SGML_CATALOG_FILES 環境變數設定,所以 C:/unix/etc/sgml/catalog 檔就會變成 OpenJade 的總資源索引檔。

Example 4. 本機的 SGML 資源總索引檔

OVERRIDE YES
-- filename: catalog --
-- file function : Under this system,all DTD version catalog file --

CATALOG "c:/unix/usr/share/sgml/isoent/catalog" -- ISO external ENTITY declare file --
CATALOG "c:/unix/usr/share/sgml/jade-dsssl/catalog" -- openjade dsssl module --
CATALOG "c:/unix/usr/share/sgml/docbook/docbook-dsssl-1.78/catalog" -- DocBook out put stylesheet --
CATALOG "c:/unix/usr/share/sgml/docbook/sgml-dtd-42/catalog" -- DocBook SGML version DTD module --
CATALOG "c:/unix/usr/share/sgml/docbook/sgml-dtd-41/catalog" -- DocBook SGML version DTD module --
CATALOG "c:/unix/usr/share/sgml/docbook/sgml-dtd-40/catalog" -- DocBook SGML version DTD module --
CATALOG "c:/unix/usr/share/sgml/docbook/sgml-dtd-31/catalog" -- DocBook SGML version DTD module --
CATALOG "c:/unix/usr/share/sgml/docbook/xml-dtd-41/catalog" -- DocBook XML version DTD module --
CATALOG "c:/unix/usr/share/sgml/docbook/xml-dtd-412/catalog" -- DocBook XML version DTD module --
CATALOG "c:/unix/usr/share/sgml/docbook/xml-dtd-42/catalog" -- DocBook XML version DTD module --

以上文件内容一定要注意,最好每行都要核实一下该文件是否真的存在,否则删除
由上範例可知,一個 catalog 檔,可以使用 CATALOG 的表述詞去引用另外一個 catalog 資源檔,從而形成一個有階層結構的資源索引,所以你不需要在 SGML_CATALOG_FILES 中把所有的 catalog 路徑寫進去,你只要把最上層的 catalog 路徑紀錄到 SGML_CATALOG_FILES 環境變數裡就可以了。

 

 

範例的 catalog 檔是表示安裝了 DocBook SGML DTD 4.2, 4.1, 4.0, 3.1 四個版本的 SGML DTD ,以及 DocBook XML DTD 4.2, 4.12, 4.1 三個版本。請你依據實際在你自己機器的 DTD 安裝狀況,改變這部分資料。


6. DocBook SGML 文件解譯實作

6.1. 製作一份 DocBook SGML 測試文件

要測驗你 DocBook 各安裝模組是否完整,設定是否正確,就要找份合乎法定格式的 DocBook 文件來實際解譯一番。如果你不太確定哪個才是合格的 DocBook 文件,不妨以下面範例貼成 dbtest.sgm 來測驗:

Example 5. 簡單的 DocBook SGML 測試文件(如果您的操作环境是非中文的,请将文件用UTF-8编码格式,否则有错误

<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.2//EN">
<book>
  <bookinfo>
    <author>
      <firstname>docbook 初學者</firstname>
    </author>
    <abstract>
      <para>本文件作為測試 Docbook 轉換運作環境是否順暢之用途
            ,歡迎複製,改寫,散佈使用。</para>
    </abstract>
  </bookinfo>
  <chapter><title>這是本文</title>
    <para>Docbook 主要文件內容所在。</para>
  </chapter>
  <appendix><title>這是附錄</title>
    <para>補充及參考資料。</para>
  </appendix>
</book>


6.2. 啟動解譯功能及命令參數解釋

首先你要開啟一個 Dos 命令視窗,接著切換到 dbtest.sgm 這個檔案的目錄所在,然後執行下列命令:(请确认命令中文件路径是否正确

openjade -t sgml -d C:/unix/usr/share/sgml/docbook/docbook-dsssl-1.78/html/docbook.dsl dbtest.sgm

執行完上述指令後會產生以 book1.htm 為首頁的一組網頁,你可以用網頁瀏覽器 I.E. 來開啟 book1.htm ,檢視轉譯結果。

如果你希望輸出結果是 rtf 格式,則可以執行下列指令:(请确认命令中文件路径是否正确

openjade -t rtf -d C:/unix/usr/share/sgml/docbook/docbook-dsssl-1.78/print/docbook.dsl dbtest.sgm

則會產生 dbtest.rtf 這個檔案,你可以用 worpad 編輯器檢視轉譯效果。

最後我為大家簡略的解說一下各命令參數的意義及用法,詳細的 openjade 參數解說,如果你是按照本文安裝 OpenJade 套件的話,應該是在 C:/unix/opt/openjade-1.3/jadedoc 目錄下的諸網頁。

 

OpenJade 的命令參數簡介

openjade

啟動 SGML 文件解譯命令名稱。

-t sgml, -t rtf

輸出格式指定:sgml 指另一種 SGML 格式文件,這裡通常是指輸出成 HTML ,HTML 也是 SGML 定義的一種格式文件,所以用 sgml 表示;rtf 則很明白,就是輸出成 MS Windows wordpad 預設支援的那種 RTF 格式文件。

-d .../html/docbook.dsl, -d .../print/docbook.dsl

輸出樣式表指定:要注意,雖然樣式表都叫 docbook.dsl ,但一個是在 html 目錄下,一個是在 print 目錄下,兩者有不同的定義和內涵。一般我們稱 HTML 為閱覽格式(online read),而 RTF 為列印格式,這就是它們用不同目錄名稱的原因。此外 DocBook 的 DSSSL 樣式表是 openjade 最麻煩囉蘇的一項參數,你不能把 docbook.dsl copy 到 dbtest.sgm 同目錄,因為 docbook.dsl 要參考到同目錄下其他的模組檔案,所以只有把很長的路徑名稱打完全。

-c C:/unix/etc/sgml/catalog

資源索引檔 catalog 指定:OpenJade 對資源索引檔 catalog 使用的優先次序,依序是命令參數指定最優先,同目錄有 catalog 檔案次之,SGML_CATALOG_FILES 環境變數指定的次序最後。所以一般的用法是,以 SGML_CATALOG_FILES 環境變數指定的 catalog 為預設選項,如果想另行指定,再使用命令參數,或同目錄另設 catalog 檔指定。所以上面範例沒有做 -c 參數指定,那就是使用 SGML_CATALOG_FILES 環境設定的資索引 catalog 檔。

dbtest.sgm

資料來源檔案名稱。


7. 建立 XML 定義的解譯環境

SGML 雖然功能繁多,定義完整,但或許是包羅太多了,導致它規格的實作,變得十分複雜而困難,據說現在負責解析轉譯 SGML DTD 定義,和 DSSSL 樣式表的執行程式,還沒有一個敢宣稱支援 SGML 所有定義的功能。也或許是因為這個緣故,新一代的標記語言 XML 稟承著 SGML 設計的精粹,但將其語法大為簡化,成為一個適合於網路傳遞的 SGML 精簡集。這個精簡集推出後,立即大為風行,尤其配合 java 程式,製作出各式各樣功能層出不窮的 XML 編輯解譯器。可以說 XML 今日支援的廣泛,早就超過了它的根源 SGML,所謂長江後浪推前浪,一代新人換舊人,大概就是指的這種狀況。

當然,這裡不是要和你聊標記語言的發展沿革,只是要說明,DocBook 原本用 SGML 語法定義的好好的,幹麻再用 XML 定義一次?因為 XML 解譯器功能發展,早就超越了 SGML ,用 XML 語法規則把 DocBook 再定義一次,目的就是想搭 XML 便利的順風車,讓 DocBook 文件也能做多種多樣的轉換處理。因此從 DocBook 4.0 開始,DocBook 每次新版發佈,都會用 SGML 和 XML 各定義一次,然後把相關模組併陳網路上,由你自己決定要用 SGML 格式還是 XML 格式。

SGML 格式還是 XML 格式?學 DocBook 還要學兩種語法嗎?別緊張,其實不必。不管是 SGML 格式的 DocBook,還是 XML 格式的 DocBook,它的標籤名稱用法都一樣,你只要依照 DocBook 官方版線上手冊 的規定,不管是 XML 還是 SGML 都 OK 。

至於 DocBook 在 XML 和 SGML 上的差異,除了在文件前置區的文件宣告小有不同外,其他的不同部分都是外部連結模組。也就是 XML 和 SGML 的 DTD 模組不同,XML 用的樣式表是 XSL ,而 SGML 是 DSSSL ,以及最重要的,負責解譯的執行工具程式不同。這些不同,別人都幫我們做好解決方案了,我們只要下載這些模組,安裝設定好,就可以一個文件,SGML 和 XML 通吃,也就是說,你只要看本說明文件,辛苦的安裝一次,以後就不必再去擔憂 XML 還是 SGML 的問題。


7.1. 安裝 for MS Windows 的 XML 解譯器

一般來說在 MS Windows 系統上,XML 解譯器最多的就是 Java 程式來執行的工具,但因為 Java 的 source 要能執行,必須要先安裝那個 Java 虛擬機器 Java VM 來搭建 Java 執行空間,而 Java VM 又與系統配置有複雜的關聯,怕本文的設計又和你原有的衝突。所以本於最少的變動,最直接的安裝步驟,我們決定不使用 Java 的 XML 解譯器,而直接使用以 C 語言編譯的獨立工具程式,不需要改變你的系統狀態,隨時可加入可移除。如果你還是覺得使用 Java 工具比較適合你,可以參考 Markus Hoenica 的英文網頁,上面有如何使用 Java 平台執行 DocBook 文件解譯的範例。

如同我們在前面建立 SGML 解譯環境所言,在下載的程式中,OpenSP 部分,是負責文件合法性檢測及資料整理,OpenJade 部分則是資料文件的格式轉換。同樣的,XML 文件解譯也是分這兩部分來處理;負責文件合法性檢測及資料整理的是 libxml 模組,負責資料文件的格式轉換的,則是 libxslt 模組。只是 OpenJade 是把兩部分都在一個套件包裡,但 libxml 和 libxslt 則是分開的兩個套件包,必須分開下載。此外 libxml 和 libxslt 在執行時,會需要 iconv(區域化語言轉換工具)和 zlib(資料壓縮處理工具組) 的支援。

你可以在 http://www.zlatkovic.com/pub/libxml/ 處份別下載下列套件後,存放於 C:/unix/usr/src 目錄下。

 

  • libxml2-2.6.7.win32.zip

  • libxslt-1.1.4.win32.zip

  • iconv-1.9.1.win32.zip

  • zlib-1.1.4.win32.zip

現在以 libxml2-2.6.7.win32.zip 為例,你應該按照下列步驟把它安裝到 MS Windows 系統中:

 

  • 開啟 C:/unix/usr/src/libxml2-2.6.7.win32.zip 檔,解壓縮到 C:/unix/opt 目錄下,則你會得到 libxml2-2.6.7.win32 這個子目錄。

  • 把 C:/unix/opt/libxml2-2.6.7.win32/util 下所有的檔案和子目錄,通通複製到 C:/unix/usr/bin 目錄下。

  • 把 C:/unix/opt/libxml2-2.6.7.win32/lib 下所有的檔案和子目錄,通通複製到 C:/unix/usr/lib 目錄下。

  • 把 C:/unix/opt/libxml2-2.6.7.win32/include 下所有的檔案和子目錄,通通複製到 C:/unix/usr/include 目錄下。

其他幾個相關的套件都有類似的路徑和子目錄結構,你可以按照同樣的原則,一一把它們安裝妥當,這樣就完成了 for MS Windows 的 XML 解譯工具的安裝了。

 

 

上面所列套件的版本編號,是本文撰寫時的最新版,你在安裝時,說不定有了更新的版本,所以請依安裝時的狀況自行調整。


7.1.1. 製作 XML 測試文件

雖然我們為 XML 做的測試文件,和前面的 SGML 格式測試文件 範例,不管是標籤定義,還是文件內容都大同小異,但因為 SGML 和 XML 的 DTD 定義方式還是有點小小的差異,所以無法照抄前面的範例。你應該把下面範例複製,貼成 check.xml 備用:

Example 6. XML 格式測試文件(推荐使用UTF-8编码格式

<?xml version="1.0" encoding="big5"?>
<!DOCTYPE HTMLLite [
<!ELEMENT HTMLLite (H1|P)* >
<!ELEMENT H1 (#PCDATA|EM|STRONG)* >
<!ELEMENT P (#PCDATA|EM|STRONG)* >
<!ELEMENT EM (#PCDATA) >
<!ELEMENT STRONG (#PCDATA) >
]>
<HTMLLite>
  <H1>XML 解析器測試文件</H1>
  <P>這是一個簡短的,合乎 XML 語言規格定義的簡短文件,本文製作的目的就是
     希望藉由一個合法的文件,來檢測你的 XML 規格解譯器能否順利運作。</P>
  <P>我們推薦你使用 <STRONG>libxml</STRONG> and <STRONG>libxslt</STRONG>
     解譯模組來測試本文件,你可以用 libxml 裡的 <EM>xmllint</EM> 工具程式
     測試本文件是否合乎法定格式,或用 <EM>xsltproc</EM> 工具程式測試是否
     能順利依 XSLT 樣式表設定執行文件格式轉換功能。</P>
  <P>本文件採用 GPL 版權宣告,歡迎轉載、改寫、散播。</P>
</HTMLLite>


7.1.2. 製作 XSL 樣式表

SGML 用 DSSSL 語言來作他的樣式表,XML 則是用 XSL or XSLT 來製作它的樣式表。我們要把 check.xml 轉換成其他可閱讀格式文件,當然需要製作一份 XSL 樣式表囉。所以請把下面範例複製成 check.xsl ,放置到與 check.xml 同目錄備用:

Example 7. XSL 格式轉換文件(推荐使用UTF-8编码格式

<?xml version="1.0" encoding="big5"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">
  <xsl:output method="html"/>

  <xsl:template match="/">
    <html>
      <head>
        <title>HTMLlite document</title>
      </head>
      <body bgcolor="#FFFFFF">
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="H1">
    <h1>
      <xsl:apply-templates/>
    </h1>
  </xsl:template>
  <xsl:template match="P">
    <p>
      <xsl:apply-templates/>
    </p>
  </xsl:template>
  <xsl:template match="EM">
    <i>
      <xsl:apply-templates/>
    </i>
  </xsl:template>
  <xsl:template match="STRONG">
    <b>
      <xsl:apply-templates/>
    </b>
  </xsl:template>
</xsl:stylesheet>


7.1.3. 執行 XML 文件格式轉換測試

資料來源 check.xml 和轉換樣式表 check.xsl 都有了以後,就可以開啟一個 Dos 命令視窗,切換到 check.xml 所在目錄,使用下列命令來執行轉換測試:

xsltproc check.xsl check.xml > check.htm

xsltproc 是執行格轉換的工具名稱[7],check.xsl 是轉換樣式表,check.xml 是資料來源文件,而 "> check.htm" 是因為前面命令會把輸出結果直接輸出到螢幕上,使用 '>' 重導命令,把螢幕資訊存到檔案 check.htm 中。

現在你已經有了一個 check.htm 網頁,請用 IE 瀏覽器觀視,它是否變成了一個標準的 HTML 文件了呢。


7.2. 安裝 DocBook 的 DTD 定義模組

如果你問我 SGML DocBook 系統設定,最重要的是什麼,我會說相關的配合模組要下載並安裝完全。但你如果問我 XML DocBook 系統設定最重要的是什麼,我的回答是網路要通。

網路要通跟系統設定什麼關係?答案是只要你網路通,系統不安裝相關的模組也成。因為 XML 格式文件在做文件宣告時,除了公用識別宣告外,還要一個系統字串宣告,系統字串宣告的作用就是指明這個 XML 文件的 DTD 定義模組在哪個位址及路徑的宣告。而更加重要的功能是,XML 的系統字串宣告是接受 URL 及 URI 跨網路存取的。所以只要發佈該文件格式的單位將相關的 DTD 定模組放在網路上供大眾讀取,而你的系統字串位址又設定正確的話,那麼你的機器裡不需要下載安裝任何的 DTD 定義模組,一樣可以解析編譯 XML 格式文件。所以正確的編譯方式是確保你的網路連線是暢通的,然後啟動你的 XML 解譯工具程式。你會看到網路連線燈猛閃,不斷有資料讀進你的主機,直到 XML 文件編譯完成為止,而且不管你系統中有沒有裝相關的 DTD 模組,反正它們第一個動作,一定是按照系統字串宣告位址,到網路上找資料。

另外一個讓 XML 的 DTD 模組安裝顯得不是那麼重要的是,XML 把文件格式分為合法(合乎 DTD 定義的文件)和良好(格式完整,但不見得符合 DTD 定義。) 兩種,並且承認良好的格式文件一樣是有效的文件。所以如果你要求的不是文件格式是否合法化的分析,而是只求把文件轉換成另一種樣式,那麼只要指定正確的樣式轉換表 XSL or XSLT ,就可達到目的,沒有 DTD 資料,並不必然妨礙轉換格式的進行。

那麼到底需不需要下載 XML 格式的 DocBook DTD 模組檔案呢,我的建議還是下載吧,因為至少你可以在 XML DTD 模組檔案中的 docbookx.dtd 檔案,查到你的 XML DocBook 文件宣告,公共字串該怎麼寫,系統字串要怎麼設才正確。你可以在 http://www.oasis-open.org/docbook/xml 處下載 XML DocBook 的各 DTD 模組版本。下面我們就以安裝 DocBook XML V4.2 DTD 模組為例,做一個示範,至於其他的 DocBook XML 版本,依照相類似步驟加以安裝即可。

 

  • 到 http://www.oasis-open.org/docbook/xml 位址,選擇 DocBook XML V4.2 連結,跳到 V4.2 頁面後選擇上方的 zip archive 連結,把 docbook-xml-4.2.zip 這個壓縮檔下載到 C:/unix/usr/src 目錄下。

  • 在 C:/unix/usr/share/sgml/docbook 目錄下,作個 xml-dtd-42 的子目錄,開啟 C:/unix/usr/src/docbook-xml-4.2.zip 檔,將其解壓縮到 xml-dtd-42 的目錄。

  • 將 C:/unix/usr/share/sgml/docbook/sgml-dtd-42/docbook.cat 這個檔案另存於同目錄下,檔名改為 catalog ,以作為系統搜尋指引之用。


7.3. 安裝 DocBook 的 XSL 樣式表

SGML 語言定義的格式文件要使用 DSSSL 樣式表來做輸出格式轉換,XML 語言定義的格式文件,當然要用 XSL(or XSLT) 樣式表轉換囉。所幸的是不管是 DSSSL 還是 XSL ,DocBook 發展小組同樣製作了 DSSSL 和 XSL 兩種樣式表,並放在同樣的 http://sourceforge.net/project/showfiles.php?group_id=21935 網路位址上。目前發佈的最新版是 1.65.1 ,所以你把 docbook-xsl-1.65.1.tar.gz 下載,儲存到 C:/unix/usr/src 路徑下,再開啟 C:/unix/usr/src/docbook-xsl-1.65.1.tar.gz ,把它解壓縮到 C:/unix/usr/share/sgml/docbook 路徑下即可。


7.4. 安裝 ISO 特殊字元實體宣告模組

DocBook 的 XML DTD 模組不需要另外安裝 ISO 特殊字元實體宣告模組,因為你進入 xml-dtd-nn 等被解壓縮後的目錄觀察,就可以看到有一個 ent 子目錄,裡面就是放的 ISO 特殊字元實體宣告模組檔案,好處當然是只要下載一個包裹就通通解決,也不需要麻煩的調整和設定。壞處是每個 XML DTD 版本都擁有自己獨立的 ent 模組,萬一那天 ISO 調整更動了這些 ISO 特殊字元實體宣告模組,SGML 的 DTD 只要去調整 C:/unix/usr/share/sgml/isoent 一個目錄的資料就好,而 XML DTD 卻需要去調整每個不同版本 DTD 子目錄底下的 ent 子目錄。

不過這不是主要的討論重點,只是告訴你,如果你只使用 XML 的 DocBook 文件解譯,可以不用下載 ISO 特殊字元實體宣告模組。


7.5. 撰寫本機適用的 XML CATALOG 檔

不需要另外撰寫,可以和 SGML 共用 CATALOG 檔,如何製作請參考前面的 本機的 SGML 資源總索引檔


8. DocBook XML 文件解譯實作

8.1. 製作一份 DocBook XML 測試文件

DocBook 的標籤名稱和結構,不管是 SGML 還是 XML ,都是一樣的,唯一應注意的是大小寫。SGML 把大小寫視為同一,但 XML 不同。所以如果你要兩邊通吃,標籤名稱請遵照 DocBook 官方版的線上手冊 http://www.docbook.org/tdg/en/html/docbook.html 的大小寫規則來撰寫。

前面我們製作的 簡單的 DocBook SGML 測試文件 ,標籤名稱及結構是完全符合 DocBook 官方版規定的。所以我們可以拿那份文件來當 XML 的測試文件,只是文件宣告的方式要改一下,其他本文敘述部份完全不用更動。首先我們用一個文字編輯器開啟前面的 dbtest.sgm 檔,把第一行 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.2//EN"> 刪除掉。

接著,你可以從某個 DocBook 特定版本的子目錄中,開啟 docbookx.dtd 檔案,來觀察其附註,明瞭文件宣告字串該如何下。譬如你要寫一份 DocBook XML V4.2 的文件,你可以用一般文字編輯器開啟 C:/unix/usr/share/sgml/docbook/xml-dtd-42/docbookx.dtd 這個檔案,你就知道文件宣告應該如下面的範例:

Example 8. DocBook XML 文件宣告(推荐使用UTF-8编码格式

<?xml version="1.0" encoding="big5"?>                            <!-- 註1 -->
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"       <!-- 註2 -->
    "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">    <!-- 註3 -->

我是用的UTF-8

這個文件宣告每一行的作用如下:

 

註1, XML 宣告

標明這是一個以 XML 語言定義的格式文件,非常重要的是 encoding 屬性的設定, XML 預設的文件編碼是 Unicode ,凡是非 Unicode 的編碼文件,都必須使用 encoding 屬性表示該文件的正確編碼。

註2, Public Identifier, 公共識別字串

和 DocBook SGML 文件宣告的公共識別一樣,每一個特殊格式文件發佈單位,都會發佈一個獨特而唯一的識別字串。這個識別字串必須依照發佈單位的要求,如同使用者 ID 和密碼一般,每一個字元都必須完全符合。

註3, System Identifier, 系統識別字串

講通俗一點就是這個版本的 DTD 檔案模組所在的路徑位址。這個路徑位址可以是本機的目錄及檔案名稱,也可以是 internet 上的 URL 及 URI 。大部分正規的,有組織的格式文件發佈單位,都會採用 internet 的 URL 及 URI 作為 System Identifier,目的是你的機器中不必多一道 DTD 模組安裝手續,只要網路通暢即可。System Identifier 的優先性高於 Public Identifier ,所以 XML 解譯時,是先上網找 DTD 模組資料的。

把範例的三行文件宣告設定,插到剛剛文件的開頭,另存檔案,名稱是 dbtest.xml,這樣就把一份 SGML 文件換成了 XML 文件。本文敘述不需更改。


8.2. 解譯 DocBook XML 文件

有了符合 DocBook XML 規定格式的文件,我們就可以試著來把 DocBook 轉換成另一種便於閱讀的格式文件。首先你該開啟一個 Dos 命令視窗,接著執行下列命令:(请确认命令中文件路径是否正确,我在本机上运行的指令是:
xsltproc C:/unix/usr/share/sgml/docbook/docbook-xsl-1.71.1/html/docbook.xsl dbtest.xml >dbtest.html)

xsltproc C:/unix/usr/share/sgml/docbook/docbook-xsl-1.65.1/html/docbook.dsl dbtest.xml >dbtest.htm

命令參數的簡略解說,請參考 執行 XML 文件格式轉換測試 這一小節的解說,若是詳細的解說,請開啟 Dos 命令視窗,執行下列命令:

xsltproc -h

9. 結語

唯有透過不同作業系統的相互對話,屏除不同規格間造成的障礙,才是塑造真正開放而自由的資訊處理環境的基礎。本文就是本著尊重個別作業系統的操作習慣,希望以最小的適應改變,達成最廣泛的資料交流。當你照著本文建議的方法,建立了 DocBook 的解譯環境後,你就只有在轉換 DocBook 文件輸出格式時,才需要離開你慣用的 GUI 操作介面,輸入一些單一轉換指令即可。其他編輯器的選擇,操作的方法,都可以維持你原來的習慣,因為你的目的是要使用一種特殊格式文件,而不是特殊的作業系統。

你不用操心你的 DocBook 文件在其他 Unix Like 的作業系統下會怎麼處理,你只要用屬於你的方式,就能和別的作業系統,別的編輯軟體共用,甚至共同撰寫、編輯資料,這就是 DocBook 格式帶來的好處。

最後要提醒的是,本文只回答在 MS Windows 下如何建立 DocBook 的解譯環境,如果你的問題是如何在 Linux 或其他 Unix Like 的作業系統建立 DocBook 解譯環境,請參考 DocBook XML/SGML Processing Using OpenJade 這篇文章。

此外本文只談 DocBook 解譯環境建立及轉換的問題,至於該如何寫作 DocBook 文件,請參考 DocBook 文件寫作入門 及 DocBook 文件寫作進階 這兩篇文章。

如果能得知,這一系列文章,真的能夠協助你的工作團隊,一個 Linux 與 MS Windows 不同作業系統之間,整合的部分解決方案,將是我最大的回饋與滿足。


A. 附錄

A.1. 參考文件

 

DocBook 官方版線上手冊

各種 DocBook 問題最權威而完整的說明,如果英文還可以,建議抽空去瀏覽一下。(英文)

SGML for NT (该连接失效,去google很快就找到

一份完整說明各種格式文件工具如何在 MS Windows 下安裝的,英文的說明網頁,也是本文主要的資料來源。(英文)

DocBook XML/SGML Processing Using OpenJade

如何在 Linux 下建立 DocBook 的解譯環境的說明文件(中譯)。

DocBook 文件寫作入門

介紹 DocBook 文件的基本架構,及常用標籤簡介(中文)。

DocBook 文件寫作進階

介紹 SGML 文件的實體宣告與文件模組化(中文)。

OpenJade

OpenJade 專案計畫的家(英文)。

Markus Hoenicka home

NT SGML 說明網頁作者的家(英文)。

Zlatkovic

Zlatkovic 組織的家(英文)。


A.2. 下載連結

 

openjade-1.3-1.exe

for MS Windows 的 SGML 解譯器

XML parser

for MS Windows 的 XML 解譯器

DocBook SGML DTD

以 SGML 語法定義的 DocBook 文件定義模組

DocBook XML DTD

以 XML 語法定義的 DocBook 文件定義模組

DocBook DSSSL Stylesheet

配合以 SGML 語法定義的 DocBook 的轉換樣式表

DocBook XSL Stylesheet

配合以 XML 語法定義的 DocBook 的轉換樣式表(不管是 DSSSL 模組還是 XSL 模組,都在同一網址。)

ISO ENTITY Module

ISO 組織的特殊字元實體宣告模組

This Doc SGML source package

這篇中文說明的 SGML DocBook 原始文件壓縮檔

Notes

[1]

也可以說只要能產出純文字格式的文字編輯器都可。

[2]

DocBook 的 SGML 規格 轉譯器。

[3]

這裡假設你 MS Windows 系統所在的磁碟機代號是 C ,如果是其他的磁碟機代號,請改用相對應的磁碟機代號。

[4]

因為我們要使用 Dos 命令模式啟動 SGML 解譯,所以檔名請遵守 Dos 8.3 制的規則,否則你在視窗中使用長檔名,到了 Dos 命令窗就變成 check~1.sgm 這種容易令人混淆的怪名稱。

[5]

DocBook V4.2 DTD 的 docbook.cat 中應該沒有 DTDDECL 敘述,但其他版的 DocBook 卻有出現的例子。

[6]

1.78 是本文撰寫時的最新版,如果你下載時版本再度更新,請依新版本自動調整。

[7]

其實 XML 的解譯步驟也和 SGML 差不多,openjade 在做樣式轉換前,會先呼叫 onsgmls 對資料來源檔進行剖析整理,而 xsltproc 也是會先呼叫 xmllint 做前置處理,再執行轉換,所以雖然命令打的是 xsltproc ,但並不表示你只需要 xsltproc 就好。

 
原创粉丝点击