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) 是一个标识互联网资源的字符字符串。
最常见的 URI 是统一资源定位符 (URL),它标识互联网域名地址。另一种不太常见的 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 教程。