XML pro web aneb od teorie k praxi - 5.díl

Dnešní díl bude věnován deklaraci atributů v DTD. Plynule tak navážeme na výklad o deklaraci elementů, který byl naším tématem minule.

Příklad DTD v minulém dílu obsahoval pouze deklarace elementů. Nedá se říci, že by se přesně taková podoba konkrétního DTD nemohla objevit. Nicméně v praxi se zcela jistě neobejdeme bez toho, aby naše formáty XML dokumentu používaly také atributy - a ty lze v DTD samozřejmě deklarovat také. Jak to udělat si dnes ukážeme. Nejprve si uvedeme příklad DTD obsahujícího pouze deklarace atributů (jedná se o deklarace atributů pro tentýž XML dokument, jako v minulém dílu). Je zřejmě jasné, že DTD obsahující pouze deklarace atributů je nesmysl, jelikož ještě nikdo neviděl atribut, který by se v XML dokumentu vyskytl bez elementu :-). Smysluplné DTD vznikne teprve spojením minulého a dnešního příkladu.


<!ATTLIST info typ (seriál|článek|zpráva|PR) "článek"
               díl CDATA #IMPLIED
               periodicita CDATA #IMPLIED>
<!ATTLIST domek název CDATA #REQUIRED>
<!ATTLIST kategorie název CDATA #REQUIRED>

V první řadě je nutné upozornit na zřejmě nejvýznamnější rozdíl mezi deklarací elementu a deklarací atributů - zatímco element deklarujeme sám o sobě a vymezujeme množinu jeho možných dětských elementů, atribut je možné deklarovat pouze zařazením do skupiny atributů vztažených k určitému elementu (resp. určitému typu elementu definovanému v rámci DTD). Nedeklarujeme tedy atribut sám o sobě, ale seznam atributů u určitého elementu. Bylo by tedy věcně správnější místo deklarace atributů říkat deklarace seznamu atributů elementu, ale kdo by se s tím chtěl stále vypisovat? :-)

Výše uvedené si nejlépe zkonkretizujeme pohledem na syntaxi, která se používá při deklaraci atributů.

<!ATTLIST info 
               typ (seriál|článek|zpráva|PR) "článek"
               díl CDATA #IMPLIED
               periodicita CDATA #IMPLIED>

Podobně jako u elementů začíná deklarace atributů znaky <!, bezprostředně poté následuje klíčové slovo ATTLIST. Po mezeře je uvedeno jméno elementu, jehož seznam atributů (ATTribute LIST) je deklarován. Poté již přichází na řadu jedna nebo případně vícero definic atributů. Celá deklarace je ukončena, stejně jako deklarace atributu, znakem >.

Definice atributu

Vybrali jsme si první deklaraci atributů, která obsahuje hned tři definice atributu (...nebo lépe řečeno definice tří atributů) u elementu info. Jedná se o atributy s názvy typ, díl a periodicita. Pro přehlednost jsem každou z těchto tří definic umístil na nový řádek, i když by bylo možné celou tuto deklaraci vložit na jediný řádek.

Každá definice atributu se skládá ze tří částí. Na prvním místě je jméno atributu. Po něm následuje definice typu atributu a nakonec je uvedena deklarace výchozí hodnoty. Například naše deklarace na druhém místě definovuje atribut díl. Definice typu atributu je určena klíčovým slovem CDATA a deklarace výchozí hodnoty slovem #IMPLIED. U v pořadí první deklarace atributu typdefinice typu atributu poněkud jinou podobu (seriál|článek|zpráva|PR), stejně tak deklarace výchozí hodnoty "článek". Co tyto konkrétní hodnoty znamenají si vysvětlíme podrobně v následujících odstavcích.

Definice typu atributu

Typ atributu lze vymezit třemi způsoby (třemi základními obecnými typy):

  • řetězcový typ (string type)
  • "tokenizovaný" typ (tokenized type)
  • výčtový typ (enumerated type)
Řetězcový typ

Řetězcový typ se v DTD označuje klíčovým slovem CDATA. Neznamená to nic jiného, než že obsahem (hodnotou) atributu může být libovolný řetězec znaků (samozřejmě s výjimkami, které jsme již uváděli ve 2. dílu tohoto seriálu). Je to tedy nejméně specifická, ale také nejvíce dovolující definice typu atributu. Příkladem může být definice atributu díl.

díl CDATA #IMPLIED

"Tokenizovaný" typ

"Tokenizovaný" typ se vymezuje jedním ze skupiny klíčových slov se zvláštním významem:

  • ID
  • IDREF
  • IDREFS
  • NMTOKEN
  • NMTOKENS
  • ENTITY
  • ENTITIES

Podívejme se popořadě na význam všech klíčových slov. Atribut typu ID označuje jméno, které se jako hodnota daného atributu může vyskytnout pouze jedinkrát v celém dokumentu (tj. hodnota takového atributu se nesmí opakovat, musí být unikátní). Atributy tohoto typu se používají k jednoznačné identifikaci elementů (např. atribut id v (X)HTML). Žádný element nesmí mít definován více než jeden atribut typu ID. Příklad definice:

identifikátor ID #REQUIRED

Atribut typu IDREF je takový atribut, jehož hodnotou může být pouze hodnota jiného atributu typu ID, která se v dokumentu vyskytuje; atribut typu IDREF je tedy referencí, odkazem, umožňuje propojení v dokumentu. Podobně je tomu u atributu typu IDREFS, pouze s tím rozdílem, že hodnotou takového atributu může být více jmen vyskytujících se jako hodnoty atributu typu ID - dovoluje tedy propojení více částí dokumentu identifikovaných pomocí jejich ID. Jednotlivá jména u konkrétní hodnoty atributu typu IDREF jsou oddělena mezerou. Příklad definice:

related IDREFS #IMPLIED

Hodnota atributu typu NMTOKEN (NaMe TOKEN) musí splňovat v podstatě stejné požadavky, které jsou kladeny na jméno elementu v XML dokumentu - musí se tedy jednat o jedno slovo složené z písmen, číslic a vymezených interpukčních znaků. NMTOKENS je seznam jmen typu NMTOKEN oddělených mezerou. Příklad definice:

jméno NMTOKENS #IMPLIED

Atribut typu ENTITY musí obsahovat název externí neparsované entity. Analogicky jako v předchozích případech ENTITIES značí seznam jmen externích neparsovaných entit. Na problematiku entit, o kterých jsme se již několikrát letmo zmínili, se podrobně zaměříme příště.

Výčtový typ

Příklad definice atributu výčtového typu se v našem příkladu vyskytuje u atributu typ.

typ (seriál|článek|zpráva|PR) "článek"

Atribut výčtového typu má definován seznam konkrétních možných hodnot. Jednotlivé hodnoty jsou odděleny znakem svislice, celý tento seznam je uzavřen do kulatých závorek. Jednotlivá jména musí být typu NMTOKEN. V našem příkladu povoluje definice atributu typ hodnoty seriál, článek, zpráva a PR.

Kromě seznamu literálních hodnot atributu může výčtový typ obsahovat také seznam jmen notací. Notace (deklarované v rámci DTD) se takto používají pro interpretaci speciálního obsahu elementu, u kterého je takový atribut definován. Notacemi se budeme podrobně zabývat v dalších dílech. Příklad definice:

analyzer NOTATION(flash|video|vector|bitmap) "bitmap"

Deklarace výchozí hodnoty

Poslední částí definice atributu je deklarace výchozí hodnoty atributu. Výchozí hodnotu lze deklarovat třemi způsoby.

První možností je klíčový výraz #REQUIRED. Označuje atribut, který musí být v XML dokumentu u příslušného elementu vždy uveden (tj. musí být explicitně uveden ale nemá žádnou výchozí hodnotu definovanou v DTD). Druhou možností je klíčové slovo #IMPLIED - tato deklarace také neurčuje žádnou výchozí hodnotu. Dává ale možnost atribut v dokumentu neuvádět, jeho přítomnost je volitelná.

Třetí možností deklarace výchozí hodnoty je uvedení konkrétní výchozí hodnoty. Ta musí být uzavřena v uvozovkách. Pokud má atribut uvedenu výchozí hodnotu, nabývá vždy této určené hodnoty, pokud není explicitně uvedena hodnota jiná. V praxi to tedy znamená, že atribut je nutné v XML dokumentu uvést jen tehdy, potřebujeme-li tomuto atributu nastavit odlišnou hodnotu, než je hodnota výchozí.

Pokud chceme specifikovat atribut, který může nabývat vždy pouze jediné hodnoty a žádné jiné, lze tak učinit přidáním klíčového výrazu #FIXED před deklaraci výchozí hodnoty v uvozovkách. Viz následující příklad:

server CDATA #FIXED "Živě"

Jak vidíte, jedná se o definici atributu server, jehož hodnota je nastavena fixně na "Živě". Deklarace fixní výchozí hodnoty má jednu příjemnou vlastnost - nemusíme tento atribut nikde v dokumentu specifikovat a přesto u XML dokumentů validizovaných tímto DTD bude tento atribut nabývat vždy stejné hodnoty.

To je o deklaraci atributů v DTD vše. Příště se konečně dostaneme k problematice, o které jsme se v průběhu výkladu zmínili již několikrát - k entitám.

Diskuze (2) Další článek: 20. výročí Internetu

Témata článku: Software, Programování, Code, XML, Klíčový výraz, Token, Zvláštní význam, První článek, Domek, Fixed, První jméno, Teorie, Element, Vector, Mezera, Orange, Jednotlivý díl

Určitě si přečtěte


Aktuální číslo časopisu Computer

Zachraňte nefunkční Windows

Jak nakupovat a prodávat kryptoměny

Otestovali jsme konvertibilní notebooky

Velký test 14 herních myší