XML技術確實是相當好,但其中的命名空間這個部分除外。事實上,幾乎所有XML開發人員都表示命名空間(namespace)的加入導致的麻煩遠甚於它原本可以帶來的好處。
雖然很多人都在反饋這個問題,但要想更改這個標准卻不是那麼容易。有一個事實就是現在確實有不少XML文檔已經包含了各種各樣的命名空間。
接下來我有幾篇文章分別介紹命名空間給XML文檔驗證、轉換、讀取帶來的麻煩,以及相應的對策。這一篇中講解的是,如何在樣式表中添加命名空間,讓它可以針對含有特殊命名空間的XML數據文件。
首先,假設我們有如下一份的XML數據文件
<?XML version="1.0" encoding="utf-8" ?>
<Order XMLns:d="http://www.xizhang.com">
<d:OrderID>10248</d:OrderID>
<d:OrderDate>2009-1-1</d:OrderDate>
</Order>
這個XML文檔其實很簡單,表示了一個訂單。實際上,定義了一個特殊的命名空間並沒有太大的作用。我這裡只是作為演示目的而加入的。
其次,我們要編寫一個XSLT文件,准備為其進行轉換
<?XML version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" XMLns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" XMLns:d="http://www.xizhang.com"
>
<xsl:output method="Html"/>
<xsl:template match="/Order">
<Html>
<body>
<table>
<tr>
<th>訂單編號</th>
<th>訂購日期</th>
</tr>
<tr>
<td>
<xsl:value-of select="d:OrderID"/>
</td>
<td>
<xsl:value-of select="d:OrderDate"/>
</td>
</tr>
</table>
</body>
</Html>
</xsl:template>
</xsl:stylesheet>
請注意,紅色粗體的部分,就是說,為了與數據文件匹配,我們必須加入相同的命名空間定義,並且在綁定元素的時候,也是要加入相應的名稱前綴的
最後,我們可以直接在XML文件中,添加對樣式表的引用。這樣它就可以直接在一些通用的XML閱讀器(例如IE)中打開了
<?XML version="1.0" encoding="utf-8" ?>
<?XML-stylesheet type="text/xsl" href="XSLTFile1.xslt"?>
<Order XMLns:d="http://www.xizhang.com">
<d:OrderID>10248</d:OrderID>
<d:OrderDate>2009-1-1</d:OrderDate>
</Order>
這個XML文件,如果直接雙擊,在浏覽器中看到的效果如下
命名空間的未來
在 XML 領域中,有許多開發都側重於處理圍繞 XML 命名空間開發而產生的一些問題。首先,當前的 W3C XML 命名空間建議的草案沒有為取消對已映射到前綴的命名空間的聲明提供機制。W3C XML 命名空間 v1.1 工作草案將提供一種機制來取消對實例文檔中前綴-命名空間映射的聲明,以糾正這種疏忽。
對於在試圖取消引用命名空間 URI 的內容時應當返回什麼內容存在著爭論,這導致在 XML 領域中引起富有爭議的辯論,並且還成為 W3C 的 Technical Architecture Group 目前爭論的焦點。當前版本的 XML 命名空間建議不要求命名空間 URI 實際上是可解析的,因為命名空間 URI 應當只是一個用作唯一標識符的命名空間名稱,而不是資源在 Internet 上的位置。
Tim Bray(XML 語言和 XML 命名空間建議最初的編輯之一)已經撰寫了一篇詳盡的論文,論述有關命名空間 URI 和命名空間文檔的問題,可以(或者也許不可以)從 URI 中檢索到這些文檔。此文包含在創建資源目錄描述語言 (RDDL) 時涉及到的許多推理。RDDL 設計用於創建命名空間文檔。