Obsah
Pomocφ XML m∙₧eme vytvß°et vlastnφ jazyky, kterΘ budou pou₧φvat syntaxi XML. V naÜem jazyku odvozenΘm od XML si m∙₧eme definovat, kterΘ elementy a atributy budou k dispozici a jak je p∙jde navzßjem kombinovat. TΘto definici se °φkß DTD û definice typu dokumentu.
Pou₧itφ DTD p°inßÜφ mnoho v²hod. Asi nejv∞tÜφ z nich je mo₧nost automatickΘ kontroly XML dokumentu oproti DTD. Pomocφ parseru m∙₧eme velice snadno zjistit, zda v dokumentu n∞co nechybφ nebo naopak nep°eb²vß. Pokud bychom nap°φklad do XML uklßdali faktury a m∞li pro n∞ odpovφdajφcφ DTD, m∙₧e zkontrolovat, jestli faktura obsahuje vÜechny nßle₧itosti û dodavatele, odb∞ratele, datum splatnosti apod.
DalÜφ v²hody p°inßÜφ pou₧φvßnφ ji₧ existujφcφch DTD. Pokud pro naÜe dokumenty pou₧ijeme n∞jakΘ DTD, kterΘ se b∞₧n∞ pou₧φvß, otev°eme si cestu k pou₧itφ mnoha jedno·Φelov²ch nßstroj∙, kterΘ prßci s dokumenty usnadnφ. Jako p°φklad nßm m∙₧e poslou₧it jazyk HTML û ten je definovßn takΘ pomocφ DTD (i kdy₧ pro jazyk SGML a ne XML) a dnes ho p°φmo podporuje nep°ebernΘ mno₧stvφ editor∙, prohlφ₧eΦ∙ a dalÜφch aplikacφ.
Ka₧d² XML dokument se sklßdß z element∙. Podφvßme se proto nejd°φve na to, jak se v DTD deklarujφ jednotlivΘ elementy, kterΘ m∙₧eme v dokumentu pou₧φvat. P°i deklaraci v₧dy urΦujeme jmΘno elementu a model obsahu, kter² urΦuje jakΘ dalÜφ elementy m∙₧e prßv∞ definovan² element obsahovat.
Definice elementu faktura, m∙₧e vypadat t°eba takto
<!ELEMENT faktura (odberatel, dodavatel, polozka+)>
Tφmto zßpisem jsme definovali element faktura, kter² musφ obsahovat element odberatel, dodavatel a n∞kolik element∙ polozka.
Nßzev elementu musφ v₧dy zaΦφnat pφsmenem, pro dalÜφ znaky lze pou₧φt i Φφsla, teΦku, dvojteΦku, pomlΦku a podtr₧φtko. Za pφsmeno jsou pova₧ovßny samoz°ejm∞ i jinΘ znaky ne₧ jen ty z anglickΘ abecedy. M∙₧eme proto v nßzvech pou₧φvat klidn∞ znaky z Φeskou diakritikou nebo azbuku. Jedin² problΘm je v tom, ₧e n∞kterΘ programy v rozporu s XML specifikacφ neum∞jφ s t∞mito znaky v nßzvu element∙ pracovat (do tΘto skupiny pat°φ nap°φklad parser od Microsoftu).
P°i deklaraci elementu je v₧dy nejd∙le₧it∞jÜφ sprßvn∞ urΦit jeho model obsahu. Tφm je toti₧ urΦena p°φpustnß struktura dokumentu. Pro velice jednoduchΘ p°φpady lze pou₧φt jako model obsahu klφΦovΘ slovo EMPTY nebo ANY. Pou₧ijeme-li EMPTY, °φkßme, ₧e elementy musφ mφt v₧dy prßzdn² obsah û nem∙₧e ji₧ obsahovat ₧ßdnΘ dalÜφ elementy. P°φkladem m∙₧e b²t HTML tag <br>, kter² bychom mohli deklarovat pomocφ
<!ELEMENT br EMPTY>
Pokud naopak nechceme obsah elementu nijak omezit, pou₧ijeme ANY. V praxi je vÜak tato mo₧nost vyu₧φvßna pouze z°φdka, proto₧e pak ztrßcφme mo₧nost pomocφ DTD efektivn∞ definovat p°φpustnou strukturu dokument∙. Vyu₧itφ nalezne snad jen p°i v²voji DTD pro pot°eby lad∞nφ.
NejΦast∞ji se vÜak v modelu obsahu vyskytujφ slo₧it∞jÜφ konstrukce, kterΘ p°esn∞ urΦujφ pou₧itelnΘ elementy. Celß modelovß skupina se pak musφ uzav°φt do zßvorek. Pokud majφ elementy nßsledovat v p°esn∞ stanovenΘm po°adφ, odd∞lφ se pomocφ Φßrky. Tak tomu bylo v naÜem p°φklad∞ s fakturou. Pokud chceme urΦit, ₧e mß nßsledovat pouze jeden z uveden²ch element∙, odd∞lφme je pomocφ znaku `|'.
<!ELEMENT clanek (nazev, (autor|editor), odstavec+)>
Takto definovan² Φlßnek m∙₧e obsahovat bu∩ element autor nebo editor. Aby bylo vÜe jednoznaΦnΘ, musφme pou₧φvat zßvorky. Na stejnΘ ·rovni se nesmφ vyskytnout elementy spojenΘ pomocφ Φßrky a `|'. Modelovß skupina (nazev, autor | editor, odstavec+) je Üpatnß, proto₧e by parser nepochopil, jak jsme to mysleli.
Za ka₧d²m elementem (nebo skupinou element∙ v zßvorkßch) v modelovΘ skupin∞ m∙₧eme uvΘst znak, kter² urΦuje poΦet opakovßnφ. Pokud ₧ßdn² nepou₧ijeme, musφ se element vyskytnout prßv∞ jednou. Pokud je v²skyt elementu nepovinn², p°ipojφme ze jeho nßzev `?'. Kdyby u Φlßnku bylo uvßd∞nφ autora nepovinnΘ, mohli bychom pou₧φt zßpis
<!ELEMENT clanek (nazev, autor?, odstavec+)>
Pokud se element m∙₧e vyskytovat libovoln∞krßt (i v∙bec), pou₧φvß se hv∞zdiΦka. Kdyby mohl mφt Φlßnek libovoln² poΦet autor∙, mohla by deklarace vypadat nßsledovn∞
<!ELEMENT clanek (nazev, autor*, odstavec+)>
V ukßzkßch jsme pou₧ili znak `+'. Ten °φkß, ₧e element se musφ vyskytovat alespo≥ jednou. Vhodnou kombinacφ vÜech v²Üe popsan²ch prost°edk∙ pak m∙₧eme popsat i pom∞rn∞ slo₧itΘ struktury.
Na urΦitΘ ·rovni je obsahem elementu ji₧ text, ne dalÜφ elementy. V tomto p°φpad∞ pou₧ijeme v modelovΘ skupin∞ specißlnφ text #PCDATA.
<!ELEMENT odstavec (#PCDATA)>
╚ast²m p°φpadem je situace, kdy element m∙₧e obsahovat jak dalÜφ elementy, tak i p°φmo text. TΘto situaci se °φkß smφÜen² obsah a modelovß skupina pak mß specißlnφ tvar.
<!ELEMENT odstavec (#PCDATA|tuΦn∞|kurzφva)*>
V elementu odstavec te∩ m∙₧eme psßt text a navφc pou₧φvat dva elementy tuΦn∞ a kurzφva.