XML 命名空间
XML 命名空间提供了一种避免元素名称冲突的方法。
名称冲突
在 XML 中,元素名称由开发人员定义。这在尝试混合来自不同 XML 应用程序的 XML 文档时,经常会导致冲突。
此 XML 包含 HTML 表格信息
<table>
<tr>
<td>苹果</td>
<td>香蕉</td>
</tr>
</table>
此 XML 包含关于表格(家具)的信息
<table>
<name>非洲咖啡桌</name>
<width>80</width>
<length>120</length>
</table>
如果将这些 XML 片段加在一起,就会发生名称冲突。两者都包含 <table> 元素,但元素的内容和含义不同。
用户或 XML 应用程序将不知道如何处理这些差异。
使用前缀解决名称冲突
可以使用名称前缀轻松避免 XML 中的名称冲突。
此 XML 包含关于 HTML 表格和家具的信息
<h:table>
<h:tr>
<h:td>苹果</h:td>
<h:td>香蕉</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>非洲咖啡桌</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
在上面的示例中,由于两个 <table> 元素的名称不同,因此不会发生冲突。
XML 命名空间 - xmlns 属性
在 XML 中使用前缀时,必须为该前缀定义一个命名空间。
可以通过元素开始标记中的xmlns属性来定义命名空间。
命名空间声明的语法如下: xmlns:prefix="URI"。
<root>
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>苹果</h:td>
<h:td>香蕉</h:td>
</h:tr>
</h:table>
<f:table xmlns:f="https://w3schools.org.cn/furniture">
<f:name>非洲咖啡桌</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://w3schools.org.cn/furniture">
<h:table>
<h:tr>
<h:td>苹果</h:td>
<h:td>香蕉</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>非洲咖啡桌</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
注意: 解析器不会使用命名空间 URI 来查找信息。
使用 URI 的目的是为命名空间提供一个唯一的名称。
但是,公司通常将命名空间用作指向包含命名空间信息的网页的指针。
统一资源标识符 (URI)
统一资源标识符 (URI) 是一个字符串,它标识 Internet 资源。
最常见的 URI 是统一资源定位符 (URL),它标识一个 Internet 域名地址。另一种不常见的 URI 类型是统一资源名称 (URN)。
默认命名空间
为元素定义默认命名空间可以避免在所有子元素中使用前缀。其语法如下
xmlns="namespaceURI"
此 XML 包含 HTML 表格信息
<table xmlns="http://www.w3.org/TR/html4/">
<tr>
<td>苹果</td>
<td>香蕉</td>
</tr>
</table>
此 XML 包含关于家具的信息
<table xmlns="https://w3schools.org.cn/furniture">
<name>非洲咖啡桌</name>
<width>80</width>
<length>120</length>
</table>
实际使用中的命名空间
XSLT 是一种可用于将 XML 文档转换为其他格式的语言。
以下 XML 文档是用于将 XML 转换为 HTML 的文档。
命名空间 "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>我的 CD 收藏</h2>
<table border="1">
<tr>
<th style="text-align:left">标题</th>
<th style="text-align:left">艺术家</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 教程.