blob: 73a5099ae60cc7595191d8fe22aeca42cc831d60 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
---
title: Namespaces
slug: Mozilla/Tech/XUL/Namespaces
translation_of: Archive/Mozilla/XUL/Namespaces
---
<p> </p>
<p>除此文档外,请参阅<a href="/en/SVG/Namespaces_Crash_Course" title="en/SVG/Namespaces_Crash_Course">Namespaces Crash Course</a>。</p>
<p><strong>XML namespaces</strong> 提供了区分重复元素和属性名称的方法。当XML文档包含来自两个或多个不同的XML模式 (或者DTD)的元素和属性时,可能会出现重复元素和属性名称。引用 <a class="external" href="http://en.wikipedia.org/wiki/Namespace">Wikipedia</a>: "一般来说,namespaces是一个抽象的容器,为项目提供上下文... 它拥有并且允许消除具有相同名称的项目的消歧。"</p>
<p>如果你熟悉C++命名空间、Java包、Perl包或者Python模块导入,那么你已经熟悉了namespaces概念。</p>
<p>XML namespace 由唯一的名称 (称为URI, 而不是URL, 即使它看起来像URL)标识。URI 可以是任何字符串,虽然大多数人选择基于URL的URI,因为URL是实现我们期望的唯一性的一种简单的方法。虽然没有任何理由去阻止其他人使用这个namespaces <code>http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul</code>, 但是不太可能有人会不小心选择这个namespaces。即使他们意外的选择了这个namespaces,他们也不可能在他们的模式/DTD中定义与XUL相同的元素 。</p>
<p>XML namespace中的任何元素类型或者属性名称都可以通过其XML namespace和其“local name”来唯一标识。 这两个项目一起定义了一个限定名称,或者 <a class="external" href="http://www.w3.org/TR/REC-xml-names/#dt-qualname">QName</a>.</p>
<p>例如: <code><xul:textbox/></code> 使用名为"xul"的namespace和本地名称 "textbox"。它不同于例子所示,例如: <code><foobar:textbox/></code> 可能出现在同一个文档中。<strong>xul</strong>和<strong>foobar</strong> namespaces必须定义在它们所使用的XML文档的顶部, 如下:</p>
<pre> <foobar:some-element
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:foobar="the-foobar-namespace">
<xul:textbox id="foo" value="bar"/>
<foobar:textbox favorite-food="pancakes"/>
</foobar:some-element>
</pre>
<p>注意我已经在同一个文档中混合了两个<code><textboxes/></code> 。区分他们的唯一的方法是他们有不同含义的namespaces.</p>
<p>还有一个事情需要了解:“default namespace(默认namespace)”。每个XML元素有一个 "default namespace", 而且它总是和XUL 元素一起使用。在XUL 文档中,您通常会看到:</p>
<pre> <window
id="foo"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
...
...
</window>
</pre>
<p>在XHTML 文档中,您会看到:</p>
<pre> <html xmlns="http://www.w3.org/1999/xhtml">
...
...
</html>
</pre>
<p>与之前相比,这里有一个非常微妙的差别。 我之前写过<code>xmlns<strong>:xul</strong>="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"</code> ,但是这儿的:<strong>xul</strong> 部分被省略。这意味着对XML解析器来说,<code>http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul</code> 是元素及其后代元素的 <strong>default namespace</strong> (除非在后代元素上被default namespace覆盖),并且,如果没有namespace 的任何元素(即,没有前缀和colon)属于default namespace。这就是为什么我们可以使用简写<code><textbox/></code>来代替XUL中的 <code><xul:textbox/></code> (即使后者在没有使用<code>http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul</code> 作为default namespace是正确的) -- XUL namespace被定义为最顶层元素的默认值。换句话说,default namespace允许一种简短的概括被用于一个元素的所有后代元素。</p>
<p>这里有一个问题:在下面的XML文档中,什么namespace包含了foo元素?</p>
<pre> <foo/>
</pre>
<p>答案是它不在namespace, 或者它在namespace中由空字符串表示:</p>
<pre> <foo xmlns=""/>
</pre>
<p>第二个例子在语义上等同于第一个例子。</p>
<p>那么第二个问题是: <code>bar</code>、 <code>baz</code> 和 <code>quux</code> 是什么名称空间中的属性?</p>
<p> </p>
<pre> <foo bar="value">
<element xmlns="namespace!" baz="value">
<element quux="value"/>
</element>
</foo>
</pre>
<p><code>bar</code> 显然不在namespace中。那么 <code>baz<font face="Open Sans, arial, x-locale-body, sans-serif"><span style="background-color: #ffffff;">和</span></font></code><code>quux</code>怎么样呢?答案是他们也不在namespace中。实际上,在namespace中没有任何前缀不确定的属性,主要是因为XML最初没有namespaces,而且从那时起,所有的XML必须保持在无namespace.这是XML namespaces常年混乱的根源。</p>
|