aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/mozilla/tech/xul/namespaces/index.html
diff options
context:
space:
mode:
Diffstat (limited to 'files/zh-cn/mozilla/tech/xul/namespaces/index.html')
-rw-r--r--files/zh-cn/mozilla/tech/xul/namespaces/index.html73
1 files changed, 73 insertions, 0 deletions
diff --git a/files/zh-cn/mozilla/tech/xul/namespaces/index.html b/files/zh-cn/mozilla/tech/xul/namespaces/index.html
new file mode 100644
index 0000000000..73a5099ae6
--- /dev/null
+++ b/files/zh-cn/mozilla/tech/xul/namespaces/index.html
@@ -0,0 +1,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>&lt;xul:textbox/&gt;</code> 使用名为"xul"的namespace和本地名称 "textbox"。它不同于例子所示,例如: <code>&lt;foobar:textbox/&gt;</code> 可能出现在同一个文档中。<strong>xul</strong>和<strong>foobar</strong> namespaces必须定义在它们所使用的XML文档的顶部, 如下:</p>
+
+<pre> &lt;foobar:some-element
+ xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:foobar="the-foobar-namespace"&gt;
+ &lt;xul:textbox id="foo" value="bar"/&gt;
+ &lt;foobar:textbox favorite-food="pancakes"/&gt;
+ &lt;/foobar:some-element&gt;
+</pre>
+
+<p>注意我已经在同一个文档中混合了两个<code>&lt;textboxes/&gt;</code> 。区分他们的唯一的方法是他们有不同含义的namespaces.</p>
+
+<p>还有一个事情需要了解:“default namespace(默认namespace)”。每个XML元素有一个 "default namespace", 而且它总是和XUL 元素一起使用。在XUL 文档中,您通常会看到:</p>
+
+<pre> &lt;window
+ id="foo"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"&gt;
+ ...
+ ...
+ &lt;/window&gt;
+</pre>
+
+<p>在XHTML 文档中,您会看到:</p>
+
+<pre> &lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
+ ...
+ ...
+ &lt;/html&gt;
+</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>&lt;textbox/&gt;</code>来代替XUL中的 <code>&lt;xul:textbox/&gt;</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> &lt;foo/&gt;
+</pre>
+
+<p>答案是它不在namespace, 或者它在namespace中由空字符串表示:</p>
+
+<pre> &lt;foo xmlns=""/&gt;
+</pre>
+
+<p>第二个例子在语义上等同于第一个例子。</p>
+
+<p>那么第二个问题是:  <code>bar</code>、 <code>baz</code> 和 <code>quux</code> 是什么名称空间中的属性?</p>
+
+<p> </p>
+
+<pre> &lt;foo bar="value"&gt;
+ &lt;element xmlns="namespace!" baz="value"&gt;
+ &lt;element quux="value"/&gt;
+ &lt;/element&gt;
+ &lt;/foo&gt;
+</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>