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
74
|
---
title: Namespaces
slug: Archive/Mozilla/XUL/Namespaces
tags:
- Add-ons
- Extensions
translation_of: Archive/Mozilla/XUL/Namespaces
---
<p> </p>
<p>Em adição a este documento, veja <a href="/pt-BR/docs/Web/SVG/Intensivo_de_Namespaces">Intensivo de Namespaces</a>.</p>
<p><strong>Namespaces em XML</strong> fornecem uma forma de distinguir elementos duplicados e nomes de atributos. Elementos duplicados e nomes de atributos podem ocorrer quando um documento XML contêm elementos de dois ou mais esquemas XML (ou DTDs, Definição de Tipo de Documento). Citando a <a href="https://pt.wikipedia.org/wiki/Espa%C3%A7o_de_nomes">Wikipedia</a>: "Em geral, um namespace é um recipiente abstrato fornecendo contexto para os itens ... detém e permite desambiguação de itens que tem o mesmo nome."</p>
<p>Se você se sente familiar com namespaces em C++, pacotes Java, pacotes Perl, ou módulo de importação em Python, você já é familiar com o conceito de namespace.</p>
<p>Um namespace é identificado por um nome únco (chamado de URI, não uma URL, apesar de poder parecer com uma URL). Um URI é qualquer string, apesar de que a maioria das pessoas escolhem um URI baseado em uma URL pois URLs são uma forma fácil de esperar por singularidade. Apesarde que não há nada prevenindo alguém de usar o namespace <code>http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul</code>, é bastante improvável que alguém iria escolhê-lo acidentalmente. Mesmo se alguém acidentalmente o escolhe, pode talvez não definir os mesmos elementos como XUL de qualquer forma (e.g., <code><textbox/></code>) em seu esquema/DTD.</p>
<p>Qualquer tipo de elemento ou nome de elemento em um namespace XML pode ser identificado por seu namespace XML e seu "nome local". Juntos, estes dois definem um <em>nome qualificado</em>, ou <a class="external" href="http://www.w3.org/TR/REC-xml-names/#dt-qualname">QName</a>.</p>
<p>Por exemplo, <code><xul:textbox/></code> usa um namespace chamado "xul" e um nome local "textbox". Isto o distingue de, por exemplo, <code><foobar:textbox/></code> que pode ocorrer no mesmo documento. Os namespaces <strong>xul</strong> e <strong>foobar</strong> devem ser definidos no topo do documento XML em que estão sendo usados, como:</p>
<pre> <foobar:algum-elemento
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:foobar="o-namespace-foobar">
<xul:textbox id="foo" value="bar"/>
<foobar:textbox comida-favorita="pizza"/>
</foobar:algum-elemento>
</pre>
<p>Note que misturei dois <code><textbox/></code> no mesmo documento. A única forma de distinguir que eles tem significados diferentes é com namespaces.</p>
<p>Há mais uma outra coisa a saber: "namespace padrão", e é usado com elementos XUL por todo o tempo. Em documentos XUL, você normalmente vê isto:</p>
<pre> <window
id="foo"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
...
...
</window>
</pre>
<p>e documentos XHTML você vê isto:</p>
<pre> <html xmlns="http://www.w3.org/1999/xhtml">
...
...
</html>
</pre>
<p>Há uma diferença muito sutil aqui em comparação com o anterior. Antes eu escrevi <code>xmlns<strong>:xul</strong>="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"</code> mas aqui a peça <strong>:xul</strong> é omitida. Isto mostra ao analisador XML que <code>http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul</code>é o <strong>namespace padrão</strong> para o elemento e seus elementos descendentes (até que seja substituído posteriormente por um namespace padrão em um elemento descendente), e que qualquer elemento sem um namespace (ex.: sem prefixo e vírgula) pertence ao namespace padrão. Por isto que podemos escrever de forma abreviada <code><textbox/></code> ao invés de <code><xul:textbox/></code> em XUL (embora o último é tão correcto quando não usamos <code>http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul</code> como namespace padrão) -- o namespace XUL é definido como o padrão no elemento mais elevado. Em outras palavras, um namespace padrão permite um tipo de forma abreviada a ser usada por todos os descendentes de um elemento.</p>
<p>Aqui vai uma pergunta: qual namespace contêm o elemento <code>foo</code> no documento XML abaixo?</p>
<pre> <foo/>
</pre>
<p>A resposta é que é em <strong>nenhum</strong> namespace, ou alternadamente, está no namespace denotado pela string vazia:</p>
<pre> <foo xmlns=""/>
</pre>
<p>Este segundo exemplo é semanticamente equivalente ao primeiro. This second example is semantically equivalent to the first.</p>
<p>Agora, uma segunda pergunta: em quais namespaces estão os atributos <code>bar</code>, <code>baz</code> e <code>quux</code>?</p>
<pre> <foo bar="value">
<element xmlns="namespace!" baz="value">
<element quux="value"/>
</element>
</foo>
</pre>
<p><code>bar</code> não é, obviamente, um namespace. E <code>baz</code> e <code>quux</code>? A resposta é que eles não são um namespace também. Na verdade nenhum atributo não pré-fixado é um namespace, principalmente porque XML originalmente não tinha namespaces, e todos os XML's do tempo tinham que ficar sem namespace. Isto é uma fonte de confusão geral em volta de namespaces em XML.</p>
|