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://gingerall.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://gingerall.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ů:
<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.