Seriál XML

V minulém dílu našeho Zápisníku jsme si řekli o tom, jak připojit DTD k dokumentu. Nyní budeme pokračovat v problemat...


V minulém dílu našeho Zápisníku jsme si řekli o tom, jak připojit DTD k
dokumentu. Nyní budeme pokračovat v problematice XML a podíváme se na to, jak
samotné DTD vypadá.
DTD obsahuje deklarace čtyř typů:
deklarace elementů;
deklarace atributů;
deklarace entit;
deklarace notací.
Deklarace elementů
Deklarace nového elementu je velice jednoduchá. Má následující tvar:
<!ELEMENT název_elementu obsah_elementu>
Název elementu musí začínat písmenem. Další znaky názvu mohou obsahovat
písmena, číslice a některé speciální znaky jako ".", "-", "_" a ":". Délka
jména není nikterak omezená. Narozdíl od HTML je důležitá velikost písmen.
Následující dva řádky deklarují dva různé elementy kapitola a Kapitola.
<!ELEMENT kapitola ...>
<!ELEMENT Kapitola ...>
Povolený obsah elementu
Nejzajímavější je však poslední část deklarace elementu, která definuje, co
může element obsahovat. Nejjednodušší je prázdný element, který nemůže
obsahovat žádné další elementy nebo text. Příkladem takového elementu mohou být
například elementy br a hr, které důvěrně známe z HTML. Jejich deklarace by
vypadala následovně:
<!ELEMENT br EMPTY>
<!ELEMENT hr EMPTY>
Právě klíčové slovo EMPTY určuje, že element nesmí nic obsahovat. V dokumentu
pak musíme psát buď <br></br>, nebo zkráceně <br/>. Není však možný zápis <br>,
protože by parser zcela marně hledal ukončovací tag </br>.
Kromě výše zmíněných případů se prázdné elementy používají například pro
vkládání obrázků. Pomocí atributů elementu pak určíme soubor, ve kterém je
obrázek uložen.
Protipólem k EMPTY je ANY. Toto klíčové slovo nám zajistí, že element může
obsahovat libovolné další elementy a text. ANY se v praxi moc často nevyužívá,
protože pro potřeby většiny aplikací příliš uvolňuje strukturu dokumentu.
Využití nalezne například při návrhu a ladění DTD, kdy nechceme najednou napsat
celé DTD.
<!ELEMENT cokoliv ANY>
Většinou máme na vnořené elementy mnohem striktnější požadavky a s EMPTY a ANY
nevystačíme. V tomto případě pak použijeme tzv. modelovou skupinu (model
group). Modelová skupina se používá pro definici elementů, které obsahují další
elementy nebo mají smíšený obsah (obsahují již přímo text a elementy).
Modelová skupina je vždy uzavřena do kulatých závorek a obsahuje alespoň jedno
slovo. Tímto slovem nejčastěji bývá jméno elementu, který může být obsažen v
právě definovaném elementu. Vnořené elementy můžeme navzájem kombinovat pomocí
oddělovačů "," a "|". Elementy, oddělené čárkou, musí následovat v pořadí, v
jakém jsou uvedeny. Pokud má tedy element html obsahovat záhlaví (head) a tělo
(body), použijeme deklaraci:
<!ELEMENT html (head, body)>
Pokud naopak elementy oddělíme znakem "|", může být obsažen pouze jeden z nich.
Příklad: potomek může být dcera nebo syn. V DTD to vyjádříme takto:
<!ELEMENT potomek (dcera | syn)>
Pomocí závorek můžeme obě dvě varianty navzájem kombinovat. Pokud má nějaký
element obsahovat elementy a, b a za nimi buď c nebo d, použijeme modelovou
skupinu (a, b, (c | d)).
Kromě pořadí elementů musíme určit jejich počet, zda jsou povinné či zda se
mohou opakovat. Pokud v modelové skupině uvedeme pouze jméno elementu, musí být
element přítomen právě jednou. Pokud je však výskyt elementu nepovinný, uvedeme
za jeho jméno znak "?". Pokud například článek obsahuje vždy název, ale autora
obsahovat nemusí, můžeme použít následující deklaraci:
<!ELEMENT clanek (nazev, autor?)>
Další obvyklou situací je, že nějaký element se může opakovat, ale musí být
přítomen alespoň jednou. Například kniha se skládá z několika kapitol, ale musí
obsahovat alespoň jednu kapitolu:
<!ELEMENT kniha (kapitola+)>
Vraťme se k předchozímu příkladu a předpokládejme, že článek může mít více
autorů a nemusí mít autora žádného. V tomto případě s výhodou využijeme znak
"*", který indikuje libovolný počet opakování.
<!ELEMENT clanek (nazev, autor*)>
Vše můžeme podle potřeby kombinovat. Pokud chceme vyjádřit, že seznam obsahuje
alespoň dvě položky, můžeme použít modelovou skupinu (polozka, polozka+).
Indikátor počtu výskytů můžeme připojit i za modelovou skupinu. Například zápis
(a, b)? říká, že se elementy a a b buď musí vyskytovat v daném pořadí, nebo
nesmí být použity.
Speciální pozornost si zaslouží případ, kdy je obsahem elementu již samotný
text. To vyjádříme pomocí slova #PCDATA. Pokud by například element em
obsahoval již pouze text, a ne další elementy, použili bychom pro jeho
deklaraci zápis:
<!ELEMENT em (#PCDATA)>
Smíšený obsah
Pokud může element obsahovat jak text, tak elementy, říkáme, že má smíšený
obsah. V tomto případě musí mít deklarace jeho obsahu speciální tvar. #PCDATA
musí být uvedeno ve skupině jako první, skupina musí být spojena pomocí
operátoru "|" a musí být volitelně opakovatelná (*). Například
<!ELEMENT em (#PCDATA, sub, sup)*>
<!ELEMENT sub (#PCDATA)>
<!ELEMENT sup (#PCDATA)>
Dokument pak může obsahovat následující text vyhovující DTD:
<em>Pozor na líh C<sub>2</sub>H<sub>5</sub>OH.</em>
Další pokračování Zápisníku
Příště se podíváme na deklaraci atributů a kontrolu dokumentu oproti DTD.
9 1085 / pahn









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.