XML 命名空間

XML 命名空間提供了一種避免元素命名沖突的方法。

命名沖突

在 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 應用程序將無法確定如何處理這類沖突。

使用前綴來解決名稱沖突

使用名稱前綴可以輕松避免 XML 中的名稱沖突。

這個 XML 包含有關 HTML 表格和一件家具的信息:

<h:table>
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>
<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> 元素。

XML 命名空間 - xmlns 屬性

在 XML 中使用前綴時,必須定義前綴的命名空間(Namespaces)。

命名空間可以通過元素開始標記中的 xmlns 屬性來定義。

命名空間聲明使用這種語法:xmlns:prefix="URI"。

<root>
<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>
<f:table xmlns:f="https://www.codew3c.com/furniture">
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>
</root>

在上面的例子中:

第一個 <table> 元素中的 xmlns 屬性為 h: 前綴提供了限定的命名空間。

第二個 <table> 元素中的 xmlns 屬性為 f: 前綴提供了限定的命名空間。

如果為元素定義了命名空間,則相同前綴的所有子元素都與相同的命名空間相關聯。

命名空間也可以在 XML 根元素中聲明:

<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="https://www.codew3c.com/furniture">
<h:table>
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>
<f:table>
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>
</root>

注意:解析器不會使用名稱空間 URI 來查找信息。

使用 URI 的目的只是為命名空間提供唯一的名稱。

不過,很多公司常常會作為指針來使用命名空間指向實際存在的網頁,這個網頁包含關于命名空間的信息。

統一資源標識符 (URI)

統一資源標識符 (Uniform Resource Identifier,URI) 是標識 Internet 資源的字符串。

最常見的 URI 是統一資源定位符 (Uniform Resource Locator,URL),它標識因特網域名地址。

另一種不太常見的 URI 類型是統一資源名稱 (Uniform Resource Name,URN)。

默認命名空間(Default Namespaces)

為元素定義默認的命名空間可以使我們免于在所有子元素中使用前綴。

請使用下面的語法:

xmlns="namespaceURI"

這個 XML 文檔攜帶 HTML 表格信息:

<table xmlns="http://www.w3.org/TR/html4/">
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>

此 XML 攜帶有關一件家具的信息:

<table xmlns="https://www.codew3c.com/furniture">
  <name>African Coffee Table</name>
  <width>80</width>
  <length>120</length>
</table>

命名空間的實際應用

XSLT 是一種可用于將 XML 文檔轉換為其他格式的語言。

下面的 XML 文檔是用于將 XML 轉換為 HTML 的文檔。

如果您仔細觀察下面的這個 XSL 文檔,就會看到大多數的標簽是 HTML 標簽。

非 HTML 的標簽都有前綴 xsl,并由此命名空間標示:"http://www.w3.org/1999/XSL/Transform":

命名空間 "http://www.w3.org/1999/XSL/Transform" 標識 HTML 文檔中的 XSLT 元素:

<?xml version="1.0" encoding="UTF-8"?>
<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 style="text-align:left">Title</th>
      <th style="text-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>

如果您想深入學習有關 XSLT 的更多內容,請閱讀我們的 XSLT 教程