XML命名空间用于解决元素名称冲突问题。
名称冲突
在XML中,元素名称由开发人员定义。尝试混合来自不同XML应用程序的XML文档时,这通常会导致名称冲突。
该XML带有HTML表信息:
<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>
元素具有不同的名称。
XML命名空间-xmlns属性
在XML中使用前缀时,前缀的名称空间必须定义。 命名空间可以由元素的开始标记中的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.w3schools.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.w3schools.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)
统一资源标识符(URI)是一个字符串,用于标识Internet资源。 最常见的URI是标识Internet域名地址的统一资源定位符(URL)。 URI的另一种(不是很常见)类型是统一资源名称(URN)。
默认命名空间
为元素定义默认的名称空间可以使我们免于在所有子元素中使用前缀。语法为: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.w3schools.com/furniture">
<name>African Coffee Table</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>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 Tutorial更多资料。