XML 命名空间 xmlns 实用指南
XML 命名空间(XML Namespaces),其缩写为 "xmlns
",提供避免元素命名冲突的方法。
名字空间有什么作用呢?
我的理解是:由于 xml 允许自定义标识,而自己自定义标识和其他人自定义标识有可能相同,但表示不同的意义。当文件交换或者共享的时候就容易产生冲突。为了避免这种冲突发生,XML 采用名字空间xmlns
来声明,允许你通过一个网址指向来区分你的标识。
比如在一个文档<table>wood table</table>
中<table>
表示桌子,而在另一个文档<table>namelist</table>
中<table>
表示表格。如果我需要同时处理这两个文档,就会发生名字冲突。为了解决这个问题,我们引进了 namespaces 这个概念。namespaces 通过给标识名称加一个网址(URL)定位的方法来区别这些名称相同的标识。
XML 命名空间属性被放置于元素的开始标签之中,声明的语法如下:<document xmlns:namespace-prefix="namespaceURI"></document>
namespace-prefix
是由你定义的 namespaces 的名称namespaceURI
就是名字空间的网址
假设上面的桌子<table>
文档来自http://www.w3.org/TR/html4/
,
我们就可以声明为: <document xmlns:w3c="http://www.w3.org/TR/html4/">
然后在后面的标识中使用定义好的名字空间:<w3c:table>wood table</table>
这样就将这两个
值得注意的是:设置 namespaceURI
并不是说这个标识真的要到那个网址去读取,仅仅作为一种区别的标志而已。
以命名冲突请看下面两个例子:
🌰 这个 XML 文档在 table 元素中携带了水果的信息:
<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
2
3
4
5
6
🌰 这个 XML 文档在 table 元素中携带了桌子的信息(家具,不能吃的哦):
<table>
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
2
3
4
5
如果上面两个 XML 文档片断碰巧在一起使用的话,那么将会出现命名冲突的情况。因为这两个片断都包含了<table>
元素,而这两个 table 元素的定义与所包含的内容又各不相同。
# 使用前缀解决命名冲突问题
下面的 XML 文档在 table 元素中携带了信息:
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
2
3
4
5
6
下面的 XML 文档携带了家具 table 的信息:
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
2
3
4
5
现在已经没有元素命名冲突的问题了,因为这两个文档对各自的 table 元素使用了不同的前缀,table 元素在两个文档中分别是(<h:table>
和<f:table>
)。
通过使用前缀,我们创建了两个不同的 table 元素。
# 使用命名空间
下面的 XML 文档在 table 元素中携带了信息:
<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>
2
3
4
5
6
下面的 XML 文档携带了家具 table 的信息:
<f:table xmlns:f="http://www.w3schools.com/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
2
3
4
5
在上面两个例子中除了使用前缀外,两个 table 元素都使用了 xmlns 属性,使元素和不同的命名空间关联到一起。
W3C 命名规范声明命名空间本身就是一个统一资源标示符,Uniform Resource Identifier (URI)。
当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
注释:用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。
请访问 http://www.w3.org/TR/html4/。
# 统一资源标识符(Uniform Resource Identifier (URI))
通用资源标识符(A Uniform Resource Identifier (URI))是一个标识网络资源的字符串。
最常用的 URI 是用来标示因特网域名地址的统一资源定位器(URL)。另一个不那么常用的 URI 是统一资源命名(URN)。在我们的例子中,我们仅使用 URL。
既然前面的例子使用的 URL 地址来标识命名空间,我们可以确信这个命名空间是唯一的。
# 默认的命名空间(Default Namespaces)
定义一个默认的 XML 命名空间使得我们在子元素的开始标记中不需要使用前缀。
他的语法如下所示: <element xmlns="namespaceURI">
下面的 XML 文档在 table 元素中包含了水果的信息:
<table xmlns="http://www.w3.org/TR/html4/">
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
2
3
4
5
6
下面的 XML 文档包含了家具 table 的信息:
<table xmlns="http://www.w3schools.com/furniture">
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
2
3
4
5
6
# 命名空间的实际应用
当开始使用 XSL 时,您不久就会看到实际使用中的命名空间。XSL 样式表用于将 XML 文档转换为其他格式,比如 HTML。
如果您仔细观察下面的这个 XSL 文档,就会看到大多数的标签是 HTML 标签。非 HTML 的标签都有前缀 xsl,并由此命名空间标示:"http://www.w3.org/1999/XSL/Transform":
<?xml version="1.0" encoding="ISO-8859-1"?>
<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 align="left">Title</th>
<th 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>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25