diff options
Diffstat (limited to 'files/zh-cn/mozilla/tech/xul/namespaces/index.html')
-rw-r--r-- | files/zh-cn/mozilla/tech/xul/namespaces/index.html | 73 |
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><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> |