XML 命名空间
XML 命名空间
Section titled “XML 命名空间”XML 命名空间提供了一种机制,用于避免在不同 XML 词汇表中定义的元素之间发生命名冲突。
想象一下组合来自不同来源的 XML——当元素名称相同但含义不同时,命名空间可以防止歧义。
问题:命名冲突
Section titled “问题:命名冲突”在 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> 元素?它们共享相同的名称,但代表完全不同的概念。
解决方案:使用前缀
Section titled “解决方案:使用前缀”通过使用映射到唯一命名空间的前缀,可以解决命名冲突。
以下是使用前缀 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 是不同的,消除了冲突。
XML 命名空间 - xmlns 属性
Section titled “XML 命名空间 - xmlns 属性”使用前缀时,必须使用 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)
Section titled “统一资源标识符 (URI)”统一资源标识符 (URI) 是一串用于标识名称或资源的字符。URLs (统一资源定位符) 是最常见的 URI 类型,指定位置(如网址)。URNs (统一资源名称) 是另一种类型,侧重于唯一命名。
在 XML 命名空间中,URI 主要用作唯一名称。
默认命名空间
Section titled “默认命名空间”您可以使用 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 示例
Section titled “命名空间实践:XSLT 示例”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。