Hlavní navigace

Úskalí XML (2)

17. 1. 2003
Doba čtení: 4 minuty

Sdílet

Zařazení do jmenných prostorů se u atributů uplatňuje trochu jinak než u elementů, což někdy může být zdrojem nejasností. Intuitivní přístup tady nevystačí; je třeba nahlédnout do specifikace.

Atributy a jmenné prostory

Prvním důležitým rozdílem je, že u atributů nelze použít standardní (defaultní) jmenný prostor. Pokud v dokumentu deklarujeme standardní jmenný prostor, tj. jmenný prostor, do něhož patří elementy bez prefixu, tato deklarace se nijak nevztahuje na atributy bez prefixu.

 <towns xmlns="http://gingerall.org/ns1"
       xmlns:pre="http://gingerall.org/ns2">

 <pre:town name="Beroun"/>

</towns>

Jako standardní je deklarován jmenný prostor http://gingera­ll.org/ns1, ale atribut name do něj nespadá. Pokud atribut nemá žádný prefix, patří vždy do stejného jmenného prostoru jako element, ke kterému náleží. V našem případě tedy atribut name patří prostoru určeného URI http://gingera­ll.org/ns2.

Další pravidlo říká, že žádný element nesmí obsahovat dva identické atributy. Atributy jsou považovány za identické, pokud mají buď stejná jména, nebo kvalifikovaná jména se stejnou lokální částí a prefixem vázaným k témuž jmennému prostoru. Podívejme se na několik příkladů:

 <towns xmlns:cz1="http://gingerall.org/cz"
       xmlns:cz2="http://gingerall.org/cz"
       xmlns:en="http://gingerall.org/en">

  <town1 name="Beroun" name="Kladno"/>
  <town2 cz1:name="Velvary" cz2:name="Veltrusy"/>
  <town3 name-cz="Praha" name-en="Prague"/>
  <town4 cz1:name="Praha" en:name="Prague"/>

  <cz1:town5 name="Praha" en:name="Prague"/>
  <cz1:town6 name="Praha" cz1:name="Prague"/>

</towns>

Elementy town1 a town2 porušují pravidlo o jedinečnosti atributů a parser by je musel odmítnout. Naproti tomu u elementů town3, town4 a town5 je všechno v pořádku; každý z atributů má jiné lokální jméno nebo je z jiného jmenného prostoru. Nejzajímavější je ale případ elementu town6. Oba atributy patří do stejného jmenného prostoru, ale pravidlo o jedinečnosti není porušeno. Správně fungující parser musí element town6 rozpoznat jako správně zformovaný s ohledem na jmenné prostory (namespace well-formed) a načíst jej. Není totiž pravda, že by oba atributy měly stejná jména, ani že by měly kvalifikovaná jména se stejnou lokální částí a prefixem vázaným k témuž jmennému prostoru. Tato argumentace vypadá jako hra se slovíčky, ale má svůj význam. Pro jeho pochopení budeme potřebovat bližší pohled na charakter a strukturu jmenných prostorů v XML.

Jmenným prostorem se v exaktních oborech obvykle rozumí sada jedinečných jmen, která nesmí obsahovat duplikáty. V XML je tomu ale jinak; tradiční pojetí jmenných prostorů by pro použití v dokumentech XML bylo příliš svazující. Jmenný prostor XML je sjednocením několika disjunktních jmenných prostorů v tradičním slova smyslu. Tyto vnitřní jmenné prostory se nazývají oddíly (partitions). Každý jmenný prostor XML obsahuje tyto oddíly:

  • oddíl elementů – Obsahuje lokální jména všech typů elementů. Nezáleží na tom, zda jsou elementy do jmenného prostoru přiřazeny pomocí prefixu nebo použitím standardní deklarace.
  • oddíl globálních atributů – Obsahuje lokální jména atributů, které nejsou vázány k elementům, u nichž se vyskytují. Tato jména musí být jedinečná v celém jmenném prostoru (a obvykle mají ve jmenném prostoru globální význam). Globální atributy mají kvalifikovaná jména (tj. jména s prefixem). Někdy se také o globálních atributech říká, že patří do jmenného prostoru explicitně.
  • oddíly atributů pro jednotlivé typy elementů – Pro každý typ elementu existuje zvláštní oddíl obsahující jména všech nekvalifikovaných atributů vyskytujících se u tohoto typu elementu. Tyto atributy patří do jmenného prostoru implicitně – přes svoji vazbu s elementem.

V našem příkladu každý z atributů elementu town6 patří do jiného oddílu; první z nich do oddílu typu elementu town6, zatímco druhý do oddílu globálních atributů. Pro přehledné porovnání jmen elementů a atributů byla definována takzvaná expandovaná jména typů elementů a atributů, zapisovaná jak jinak než v XML. Takto vypadají expandovaná jména elementu town6 a jeho atributů:

skoleni

<ExpEType type="town" ns="http://gingerall.org/cz"/>

<ExpAName name="name" eltype="town" elns="http://gingerall.org/cz"/>
<ExpAName name="name" ns="http://gingerall.org/cz"/>

Pravidlo o jedinečnosti atributů pak můžeme přeformulovat takto: Atributy zapsané u jednoho elementu musí mít různá expandovaná jména.

Pochopení vztahu atributů a jmenných prostorů se může hodit při návrhu typu dokumentu. Zařazení atributů do jmenných prostorů je podporováno moderními jazyky pro popis schémat. W3C XML Schema rozlišuje globální a lokální atributy, a to dokonce ve stejném významu jako specifikace jmenných prostorů. RelaxNG umožňuje u každé definice atributu specifikovat (pomocí nepovinného atributu ns), zda tento atribut patří do jmenného prostoru explicitně, nebo patří-li do oddílu svého elementu.