Domyślne przestrzenie nazw XML dla niekwalifikowanych nazw atrybutów?

Próbuję zrozumieć poprawną interpretację definicji "Przestrzenie nazw w XML 1.0 (Third Edition)" dla niekwalifikowanych przestrzeni nazw atrybutów.

" Nazwa przestrzeni nazw dla atrybutu name zawsze nie ma wartości."

I później w tej samej sekcji:

" wartość atrybutu w domyślnej deklaracji przestrzeni nazw może być pusta. Ma to taki sam skutek, w zakresie deklaracji, że nie doszło do niewykonania zobowiązania przestrzeń nazw."

Więc jeśli chcę zadeklarować domyślną przestrzeń nazw dla elementu (i jego dzieci), Czy muszę również zadeklarować mapowanie prefiksu-przestrzeni nazw dla atrybutów, które znajdują się w tej przestrzeni nazw?

Na przykład w tym przykładzie

<parent xmlns="http://example.com/foo">
    <child attrib="value">text</child>
<parent>

Zinterpretowałbym powyższą definicję mówiąc, że przestrzeń nazw {[3] } jest pusta.

Więc gdybym potrzebował attrib mieć taką samą przestrzeń nazw jak parent, to byłbym zmuszony to zrobić?

<foo:parent xmlns:foo="http://example.com/foo">
    <foo:child foo:attrib="value">text</foo:child>
<foo:parent>

Lub to?

<parent xmlns="http://example.com/foo" xmlns:foo="http://example.com/foo">
    <child foo:attrib="value">text</child>
<parent>

Wydaje mi się to głupie, ponieważ wydaje się, że pokonuje cel domyślnych przestrzeni nazw. Mam nadzieję, że źle zrozumiałem specyfikację.

Author: Deduplicator, 2010-07-22

3 answers

Masz rację. Atrybuty nie będące częścią domyślnej przestrzeni nazw są uważane za istniejące w "przestrzeni nazw elementu" - więc w tym przypadku <foo:child/> jest uważane za "Przestrzeń nazw" dla @attrib. Zauważ, że jest to tylko konceptualne; nie ma API ani niczego, co odnosi się do przestrzeni nazw atrybutów w ten sposób.

Zostało to wybrane, ponieważ wiele elementów może mieć atrybuty o tych samych nazwach, ale różne znaczenia - w przeciwieństwie do tradycyjnej przestrzeni nazw, która jest zbiorem nazw (więc nie ma duplikatów). W pewnym sensie daje więcej struktury przestrzeni nazw, zamiast mieć płaski zestaw.

Możesz przeczytać o tym w bardzo starej wersji rekomendacji przestrzeni nazw .

Ta konwencja oznacza, że gdy widzisz prefiks atrybutu, reprezentuje on pewne "dodatkowe" informacje, które nie są związane z głównym schematem w dokumencie.

 14
Author: porges,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-22 21:11:32

Zgodnie ze specyfikacją, masz rację, że przestrzeń nazw attrib w pierwszym przykładzie jest pusta. Jednak jest tu subtelność, która może nie być łatwo oczywista.

Rozważ ten przykład w specyfikacji elementu z dwoma atrybutami o tej samej nazwie(jeden prefiks i drugi nie zdefiniowany).

<!-- This is OK, even though an element cannot have two attributes 
     with the same name -->
<x xmlns:n1="http://www.w3.org" 
   xmlns="http://www.w3.org" >
  <good a="1"     n1:a="2" />
</x>

Jest to zgodne, ponieważ dwa atrybuty są rzeczywiście w dwóch różnych przestrzeniach nazw:

  • n1:a należy do http://www.w3.org przestrzeni nazw (która jest przestrzenią nazw good)
  • a jest traktowane jako należące do niedostępnej przestrzeni nazw http://wwww.w3.org > good (i różni się od przestrzeni nazw good).

Zauważ, że http://wwww.w3.org > good przestrzeń nazw nie istnieje; na przykład, nie możesz wyszukiwać atrybutów w tej przestrzeni nazw za pomocą XPath. Jeśli poprosisz o namespace-uri(\\good\a), będzie pusta. Aby stworzyć konkretną koncepcję oddzielnej przestrzeni nazw elementu, stworzyłem przestrzeń nazw, która ma zarówno przestrzeń nazw elementu, jak i nazwę wraz z separatorem ({[10] } i tak nie jest dozwolone unescaped w wartościach atrybutów).

Teraz, zamiast mówić, że dwa atrybuty są w dwóch różnych przestrzeniach nazw, bardziej poprawne jest stwierdzenie, że należą one do dwóch różnych partycjiprzestrzeni nazw :

  • n1:a atrybut należy do globalnej partycji atrybutów(http://www.w3.org)
  • good element należy do wszystkich typów elementów (również http://www.w3.org)
  • a należy do partycji typu per Element z good (tj., http://wwww.w3.org > good).

Oto odpowiednia część porcji spec powiązanych z:

A. 2 partycje przestrzeni nazw XML

W celu wspierania celu, jakim jest uczynienie zarówno wykwalifikowanych, jak i niewykwalifikowanych nazwy przydatne w spełnianiu ich zamierzonego celu, identyfikujemy nazwy pojawiające się w przestrzeni nazw XML jako należące do jednego z kilku tradycyjna (tj. set-structured) przestrzeń nazw, zwana przestrzenią nazw partycje. Partycje to:

The All Partycja typów elementów Wszystkie typy elementów w przestrzeni nazw XML pojawiają się na tej partycji. Każdy ma unikalną część lokalną; połączenie nazwy przestrzeni nazw i części lokalnej w unikalny sposób określa typ elementu.

Globalna partycja atrybutów ta partycja zawiera nazwy wszystkich atrybutów, które są zdefiniowane w tej przestrzeni nazw jako globalne. Jedyną wymaganą cechą globalnego atrybutu jest to, że jego nazwa będzie unikalna w atrybucie globalnym partycja. Niniejsza Specyfikacja nie daje żadnych twierdzeń co do właściwego wykorzystania takich atrybutów. Na unikalne połączenie nazwy przestrzeni nazw i nazwy atrybutu identyfikuje atrybut globalny.

Partycje typu per-Element każdy typ partycji typu all element ma powiązaną przestrzeń nazw, w której pojawiają się nazwy atrybuty niekwalifikowane, które są przewidziane dla tego elementu. To jest tradycyjna przestrzeń nazw, ponieważ wygląd duplicate atrybut nazwy na elemencie są zakazane przez XML 1.0. Połączenie nazwa atrybutu z typem elementu i nazwą przestrzeni nazw w unikalny sposób identyfikuje każdy atrybut niekwalifikowany.

W dokumentach XML zgodnych z tą specyfikacją, nazwy wszystkich atrybuty kwalifikowane (prefiksowe) są przypisywane do atrybutu globalnego partycji, a nazwy wszystkich atrybutów niekwalifikowanych są przypisane do odpowiednią partycję dla poszczególnych elementów.

 6
Author: Raghu Dodda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-25 05:48:07

Twoja interpretacja spec jest poprawna. Pewne uzasadnienie jest również podane w drugim akapicie sekcji 6.2 w specyfikacji przestrzeni nazw, o której wspomniałeś:

Interpretacja atrybutów jest określona przez element, na którym się pojawiają.

Ale byłabym również zainteresowana jakimiś szczegółami, dlaczego wybrano takie konkretne zachowanie.

 2
Author: Jörn Horstmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-22 21:06:36