Hlavní navigace

Úskalí XML (2)

Petr Cimprich

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ů:

<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.

Našli jste v článku chybu?

7. 12. 2007 14:41

Tomas (neregistrovaný)
Podle tvoji definice je human readable i /boot/vmlinuz nebo /dev/random
- to taky obsahuje znaky mezi 0x20 a 0x7F .... (mimo jine)

8. 4. 2003 15:13

hibernatus (neregistrovaný)

ehm... ktore z uvedenych znakov nie je mozne precitat?
uz som raz napisal: "human_readable != human_understandable" - 'fcourse je to moj osobny pohlad. ak niekto predlozi akceptovatelnejsiu alternativu - no problem.


DigiZone.cz: ČT láká na jarní programové tipy

ČT láká na jarní programové tipy

DigiZone.cz: Co chtějí operátoři při přechodu na DVB-T2?

Co chtějí operátoři při přechodu na DVB-T2?

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

120na80.cz: 5 nejčastějších mýtů o kondomech

5 nejčastějších mýtů o kondomech

Měšec.cz: Jak levně odeslat balík přímo z domu?

Jak levně odeslat balík přímo z domu?

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

Vitalia.cz: Taky věříte na pravidlo 5 sekund?

Taky věříte na pravidlo 5 sekund?

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

DigiZone.cz: Rádio Šlágr má licenci pro digi vysílání

Rádio Šlágr má licenci pro digi vysílání

Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR