XML教程
XML的用途不是單一的。雖然讀者可能看到編寫只使用一個標記符號集的文檔是相當有用的(第4和第5章的棒球運動就是如此),但將不同的XML應用程序的標記混合,並進行匹配,甚至更為有用。例如,可將BIOGRAPHY元素包括在各個PLAYER元素中。由於傳記基本上是由自由形態的、格式化的文本組成,所以,以結構整潔的HTML格式編寫它就很方便,而無需從零做起重新定義所有的用於段落、分行符、列表項、粗體元素等等的標記。
但是,問題是,當混雜和匹配不同的XML應用程序的標記時,可能會發現同一個標記已用於兩個不同對象。TITLE是指頁標題還是書的標題?ADDRESS是指公司的郵件地址還是Web站點管理人員的電子郵件地址?命名域(namespace)可以解決這些諸如此類的問題,它是將URI與各標記集相關聯,並在每個元素前加上一個前綴,以表示它屬於哪個標記集。於是,就可以有BOOK:TITLE和HTML:TITLE兩個元素或POSTAL:ADDRESS和HTML:ADDRESS元素,而不只一類TITLE或ADDRESS。本章將說明如何使用命名域。
本章的主要內容如下:
* 何為命名域?
* 命名域語法
* DTD中的命名域
18.1 何為命名域
XML能夠使開發者為工程創建自己的標記語言。這些語言可以和工作於世界各地的類似工程的工作者們共享。使用這種方式工作的典型實例之一就是XSL。XSL本身就是用於XML樣式文檔的一個XML應用程序。XSL變換語言必須輸出任意的、結構整潔的XML,或許還包括XSL本身。因此,需要有明確的手段來區分何為XSL轉換指令的XML元素、何為輸出的XML元素,即便它們有相同的名稱也得要區分開!
命名域就是這種解決方案。命名域允許文檔中的每個元素和特性放在不同的命名域中。組成XSL轉換指令的XML元素放在http://www.w3.org/XSL/Transform/1.0命名域中。成為輸出部分的XML元素仍放在某個其他方便的命名域(如http://www.w3. org/TR/REC-html40或http://www.w3.org/XSL/Format/1.0)中。只要命名域不同,那麼命名域的精確性就不顯得很重要。
如果熟悉C++和其他程序語言命名域,那麼在深入閱讀本章之前,需要將以前的概念放置一邊。XML命名域與編程中使用的命名域類似,但不完全相同。特別是,XML命名域沒有必要組成一個集合(沒有重名的集合)。
清單15-2是從源符號集轉換到XSL格式化對象的變換,最早出現在第15章的"XSL格式化對象"中。它顯示了XSL樣式單,可從輸入XML轉換成XSL格式化對象。格式化引擎使用命名域來區分作為XSL指令的元素和用於輸出的文字數據。http://www.w3.org/XSL/Transform/1.0命名域中的任何元素都表示一個轉換指令。http://www.w3.org/XSL/Format/1.0命名域中的任何元素包括輸出部分。
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/XSL/Transform/1.0"
xmlns:fo="http://www.w3.org/XSL/Format/1.0"
result-ns="fo" indent-result="yes">
<xsl:template match="/">
<fo:root xmlns:fo="http://www.w3.org/XSL/Format/1.0">
<fo:layout-master-set>
<fo:simple-page-master page-master-name="only">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence>
<fo:sequence-specification>
<fo:sequence-specifier-single page-master-name="only"/>