XML 命名空間提供避免元素命名沖突的方法。
XML 命名空間(XML Namespaces)
命名沖突
在 XML 中,元素名稱是由開發者定義的,當兩個不同的文檔使用相同的元素名時,就會發生命名沖突。
這個 XML 文檔攜帶著某個表格中的信息:
<table>
<tr> <td>Apples</td> <td>Bananas</td> </tr></table>
這個 XML 文檔攜帶有關桌子的信息(一件家具):
<table>
<name>African Coffee Table</name> <width>80</width> <length>120</length></table>
假如這兩個 XML 文檔被一起使用,由于兩個文檔都包含帶有不同內容和定義的 <table> 元素,就會發生命名沖突。
XML 解析器無法確定如何處理這類沖突。
使用前綴來避免命名沖突
此文檔帶有某個表格中的信息:
<h:table>
<h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr></h:table>
此 XML 文檔攜帶著有關一件家具的信息:
<f:table>
<f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length></f:table>
現在,命名沖突不存在了,這是由于兩個文檔都使用了不同的名稱來命名它們的 <table> 元素 (<h:table> 和 <f:table>)。
通過使用前綴,我們創建了兩種不同類型的 <table> 元素。
使用命名空間(Namespaces)
這個 XML 文檔攜帶著某個表格中的信息:
<h:table xmlns:h="http://www.w3.org/TR/html4/"
> <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table>
此 XML 文檔攜帶著有關一件家具的信息:
<f:table xmlns:f="http://www.w3school.com.cn/furniture"
> <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table>
與僅僅使用前綴不同,我們為 <table> 標簽添加了一個 xmlns 屬性,這樣就為前綴賦予了一個與某個命名空間相關聯的限定名稱。
XML Namespace (xmlns) 屬性
XML 命名空間屬性被放置于元素的開始標簽之中,并使用以下的語法:
xmlns:namespace-prefix="namespaceURI"
當命名空間被定義在元素的開始標簽中時,所有帶有相同前綴的子元素都會與同一個命名空間相關聯。
注釋:用于標示命名空間的地址不會被解析器用于查找信息。其惟一的作用是賦予命名空間一個惟一的名稱。不過,很多公司常常會作為指針來使用命名空間指向實際存在的網頁,這個網頁包含關于命名空間的信息。
請訪問 http://www.w3.org/TR/html4/。
統一資源標識符(Uniform Resource Identifier (URI))
統一資源標識符是一串可以標識因特網資源的字符。最常用的 URI 是用來標示因特網域名地址的統一資源定位器(URL)。另一個不那么常用的 URI 是統一資源命名(URN)。在我們的例子中,我們僅使用 URL。
默認的命名空間(Default Namespaces)
為元素定義默認的命名空間可以讓我們省去在所有的子元素中使用前綴的工作。
請使用下面的語法:
xmlns="namespaceURI"
這個 XML 文檔攜帶著某個表格中的信息:
<table xmlns="http://www.w3.org/TR/html4/"
> <tr> <td>Apples</td> <td>Bananas</td> </tr> </table>
此 XML 文檔攜帶著有關一件家具的信息:
<table xmlns="http://www.w3school.com.cn/furniture"
> <name>African Coffee Table</name> <width>80</width> <length>120</length> </table>
命名空間的實際應用
當開始使用 XSL 時,您不久就會看到實際使用中的命名空間。XSL 樣式表用于將 XML 文檔轉換為其他格式,比如 HTML。
如果您仔細觀察下面的這個 XSL 文檔,就會看到大多數的標簽是HTML標簽。非 HTML 的標簽都有前綴 xsl,并由此命名空間標示:"http://www.w3.org/1999/XSL/Transform":
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr> <th align="left">Title</th> <th align="left">Artist</th> </tr> <xsl:for-each select="catalog/cd"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>