Skip to content

XML 命名空间

XML 命名空间提供了一种机制,用于避免在不同 XML 词汇表中定义的元素之间发生命名冲突。

想象一下组合来自不同来源的 XML——当元素名称相同但含义不同时,命名空间可以防止歧义。

在 XML 中,您可以自定义元素名称。当混合来自不同应用或标准的 XML 文档时,这种自由可能导致冲突。

考虑一下这段表示 HTML 表格的 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>

如果您将这些片段组合起来,程序如何知道它处理的是哪个 <table> 元素?它们共享相同的名称,但代表完全不同的概念。

通过使用映射到唯一命名空间的前缀,可以解决命名冲突。

以下是使用前缀 h (代表 HTML) 和 f (代表家具) 的组合示例:

<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://example.com/furniture-schema">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>

现在,h:table 和 f:table 是不同的,消除了冲突。

使用前缀时,必须使用 xmlns 属性为每个前缀声明一个命名空间。

语法是 xmlns:prefix="URI"。

在上面的示例中:

  • xmlns:h="http://www.w3.org/TR/html4/" 声明了 h 前缀的命名空间。
  • xmlns:f="https://example.com/furniture-schema" 声明了 f 前缀的命名空间。

URI (统一资源标识符) 作为命名空间的唯一标识符。它不一定指向一个可检索的资源,尽管它经常指向文档。

命名空间声明可以应用于定义它们的元素及其子元素。您也可以在根元素上声明命名空间以获得更广泛的作用域:

<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="https://example.com/furniture-schema">
<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) 是一串用于标识名称或资源的字符。URLs (统一资源定位符) 是最常见的 URI 类型,指定位置(如网址)。URNs (统一资源名称) 是另一种类型,侧重于唯一命名。

在 XML 命名空间中,URI 主要用作唯一名称。

您可以使用 xmlns="URI"(不带前缀)为元素及其后代声明一个默认命名空间。其作用域内不带前缀的元素属于此默认命名空间。

HTML 表格示例:

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

家具表格示例:

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

注意:不带前缀的属性不属于默认命名空间。如果它们属于某个命名空间,则需要显式的前缀。

XSLT (可扩展样式表语言转换) 是一种基于 XML 的语言,用于转换 XML 文档。XSLT 本身广泛使用命名空间。

考虑一下这个将 CD 目录转换为 HTML 的简单 XSLT 样式表:

<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>Title</th>
<th>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>

在这里,像 <xsl:stylesheet>、<xsl:template>、<xsl:for-each> 和 <xsl:value-of> 这样的元素属于 XSLT 命名空间,由 xsl 前缀和 URI http://www.w3.org/1999/XSL/Transform 标识。不带前缀的元素(如 <html>、<h2>、<table> 等)是字面结果元素,旨在成为 HTML 输出的一部分。

命名空间在许多基于 XML 的技术中至关重要,例如 SVG、SOAP 和 XML Schema。