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

Z obsáhlejšího tématu DTD dnes odkrojíme první pořádný kus - budeme se zabývat deklarací elementů a vším, co s tím souvisí.

Úplně na začátku bych rád upřesnil dva podobné pojmy, které byly zmíněny v minulém dílu - jaký je tedy rozdíl mezi Deklarací typu dokumentu a Definicí typu dokumentu?

Deklarace typu dokumentu je příslušná část dokumentu, která obsahuje (ať už přímo v podobě "inline" deklarace elementů, atributů, atd., tj. v interním subsetu, nebo v podobě "odkazu" na zvláštní soubor, tj. v externím subsetu) tzv. deklaraci značkování. Deklarace značkování používá syntaxi jazyka DTD (Document Type Definition) pro popis pravidel struktury dokumentu. Souhrn všech pravidel pro strukturu určitého dokumentu se také nazývá termínem Definice typu dokumentu (Document Type Definition).

Krátce řečeno, Deklarace typu dokumentu je část XML dokumentu obsahující deklaraci značkování, která nese Definici typu dokumentu, popsanou jazykem DTD. Věřím, že tyto nuance jsou tímto vyjasněny a nyní si mohu dovolit používat zkratku "DTD" jako přijatelné zjednodušení všech výše popsaných termínů bez dalšího vysvětlování :-).

Co najdeme v DTD?

Deklarace značkování v DTD může obsahovat:

  • Deklarace elementů
  • Deklarace atributů
  • Deklarace entit
  • Deklarace notací
  • Procesní instrukce
  • Komentáře

Deklarace elementů

Procesní instrukce a komentáře již známe z minula, problematiku entit a notací si necháme na další díly. Jelikož problematika je relativně obsáhlá, necháme si deklaraci atributů na příště a dnes se tedy budeme zabývat deklarací elementů. Podívejme se nejprve na příklad DTD pro náš XML dokument. Bude obsahovat pouze deklarace elementů.


<!ELEMENT článek (název, autor+, info, domek, příklad?)>
<!ELEMENT název (#PCDATA)>
<!ELEMENT autor (#PCDATA)>
<!ELEMENT info EMPTY>
<!ELEMENT domek (kategorie*)>
<!ELEMENT kategorie (subkategorie*)>
<!ELEMENT příklad (#PCDATA)>

Deklarace elementu začíná sekvencí <!ELEMENT. Po mezeře následuje jméno elementu, který deklarujeme, poté následuje specifikace obsahu elementu. Deklarace elementu končí znakem >. V našem příkladu DTD máme na každém řádku jednu deklaraci elementu, podívejme se tedy například na první deklaraci elementu.

<!ELEMENT článek (název, autor+, info, domek, příklad?)>

Deklarujeme element článek (který je kořenovým elementem našeho XML dokumentu). Specifikace obsahu je v tomto případě výčtem všech elementů, které může element článek obsahovat, uzavřený do kulatých závorek.

(název, autor+, info, domek, příklad?)

Specifikace obsahu výčtem

Element článek tedy může obsahovat (jinými slovy, dětmi elementu článek mohou být) elementy název, autor, info, domek a příklad. Formulace "element může obsahovat" ale není úplně přesná. Ve skutečnosti nám výše uvedená specifikace obsahu elementu článek podává o dost přesnější informaci. Pokud jsou názvy elementů, které může daný element obsahovat, odděleny pomocí čárky, musí se v příslušném elementu vyskytovat přesně v tom pořadí, v jakém jsou uvedeny v deklaraci.

Indikátory výskytu

Výskyt elementu pak zpřesňují další značky - jistě jste si všimli, že za názvem elementu autor je znaménko plus (+) a za názvem elementu příklad je znaménko otazník (?). U dvou dalších deklarací elementů (domek a kategorie) je ve specifikaci obsahu uvedeno znaménko hvězdička (*). Tyto značky vymezují počet opakování elementu, za kterým se nacházejí, jako dítěte deklarovaného elementu. Význam těchto značek shrnuje následující tabulka.

indikátor význam
? element se může vyskytnout jednou, nebo vůbec
+ element se může vyskytnout jednou, nebo vícekrát
* element se může vyskytnout v libovolném počtu, nebo se nemusí vyskytnout vůbec

Pokud za elementem není uvedena žádná z těchto tří značek, element se musí vyskytnout právě jednou. Pokusme se nyní na základě získaných poznatků zrekonstruovat význam deklarace elementu článek: Element článek musí obsahovat (v tomto pořadí) jeden element název, jeden či vícero elementů autor (v kontextu významu našeho XML dokumentu tím specifikujeme, že autorů může být i více než jeden), jeden element info, jeden element domek a může obsahovat jeden element příklad (tj. nemusí tam být).

Skupiny elementů

Stejným způsobem, jako specifikujeme počet opakování jednoho elementu, můžeme upřesnit (za pomoci výše uvedených značek) i výskyt celé skupiny elementů, uzavřené v kulatých závorkách. Stačí jen přidat příslušné znaménko za tuto skupinu elementů.

<!ELEMENT článek (název, autor+, info, domek, příklad?)+>

Nyní deklarace povoluje i více než jediné opakování skupiny elementů název, autor, info, domek a příklad v rámci elementu článek.

Pokud deklarujeme obsah elementu definicí možných dětských elementů, musí být názvy těchto elementů uzavřeny v kulatých závorkách - a to i kdyby skupinu dětských elementů tvořil pouze jediný element. Pomocí kulatých závorek lze vytvářet i podskupiny elementů. Těmto podskupinám pak lze určit jiný počet opakování, než zbytku elementů.

<!ELEMENT článek (název, autor+, info, (domek, příklad?)+)>

V předchozí deklaraci jsme pomocí kulatých závorek vyčlenili skupinu elementů domek a příklad, která se může opakovat více než jednou.

Specifikace obsahu výběrem z alternativ

Kromě definice obsahu elementu výčtem elementů oddělených čárkami můžeme také specifikovat možné dětské elementy jako alternativy. Element pak může obsahovat kterýkoliv, ovšem pouze jediný element z těchto alternativ. Místo čárky použijeme jako oddělovače svislé čáry ( " | ", programátoři jistě znají tento znak jako operátor vyskující se v programovacích jazycích ve významu "nebo", "or") Podívejte se na následující příklad deklarace elementu (který se ovšem v našem XML dokumentu nevyskytuje).

<!ELEMENT dataset (histor_data|actual_data|forecast_data)>

Element dataset musí obsahovat buď element histor_data, nebo element actual_data, nebo element forecast_data. Se skupinou elementů definovaných jako alternativy můžeme pracovat stejně, jako se skupinou elementů definovaných výčtem, můžeme je i snadno kombinovat, viz následující příklady.

<!ELEMENT dataset (histor_data|actual_data|forecast_data)+>

V tomto případě se může element opakovat vícekrát za sebou - na kterékoliv pozici však může být vždy kterýkoliv ze tří možných.

<!ELEMENT dataset (histor_data,(actual_data|forecast_data))+>

Tato deklarace specifikuje jedno a více opakování skupiny dvou elementů. Prvním je element histor_data, druhým může být element actual_data, nebo forecast_data.

<!ELEMENT dataset ((histor_data|actual_data|forecast_data)|(definition, data_content, data_key))>

Nyní může element dataset obsahovat buď jeden z trojice elementů histor_data, actual_data a forecast_data, nebo trojici elementů v pořadí definition, data_content a data_key.

Specifikace obsahu elementu se znakovými daty

V předchozích příkladech jsme vždy deklarovali elementy, jejichž obsahem byly pouze další elementy. O takovém elementu pak říkáme, že má elementový obsah (element content). Víme však, že element může obsahovat také znaková data (jednoduše řečeno text). Pokud element obsahuje text, mluvíme o tom, že element má smíšený obsah (mixed content), lhostejno, jestli obsahuje také ještě další elementy, nebo jen text samotný.

Deklaraci elementu, který obsahuje pouze text, máme v našem příkladu zastoupenu v podobě deklarace elementu název.

<!ELEMENT název (#PCDATA)>

Znaková data označuje v deklaraci elementu klíčové slovo #PCDATA (které vzniklo z termínu parsed character data). Pokud element obsahuje kromě znakových dat také elementy, mohou být deklarovány také, nicméně musí být specifikovány jako alternativy (tj. odděleny pomocí svislé čárky) a celá skupina musí být následována identifikátorem libovolného výskytu * (hvězdička). V případě deklarace elementu se smíšeným obsahem tedy nelze definovat pořadí, ani počet výskytů. Deklarace elementu se smíšeným obsahem textu a elementů vypadá například takto:

<!ELEMENT dataset (#PCDATA|histor_data|actual_data|forecast_data)*>

Specifikace prázdného elementu

Jako poslední typ elementu nám zbyl prázdný element. Ten nemá žádný obsah. V deklaraci elementu je pro tento případ vyhrazeno klíčové slovo EMPTY, které se neuzavírá do kulatých závorek. Příkladem je deklarace elementu info z našeho příkladu.

<!ELEMENT info EMPTY>

Obsah elementu lze specifikovat v deklaraci elementu ještě klíčovým slovem ANY - element pak může obsahovat jakýkoliv element deklarovaný v rámci DTD.

<!ELEMENT článek ANY>

Je jasné, že taková deklarace obsah elementu příliš podrobně nespecifikuje, nicméně lze ji s výhodou použít tehdy, pokud ještě přesně nevíme, jak by DTD mělo vypadat (tj. při návrhu a testování DTD).

Jednoznačný model obsahu elementu

Z důvodu kompatibility se SGML je vyžadováno, aby model obsahu elementu (který je definován pravidly při deklaraci elementu s elementovým obsahem) byl jednoznačný (Deterministic Content Model). O co se jedná si nejsnáze ukážeme na příkladu modelu, který není jednoznačný. Podívejte se na následující specifikaci obsahu elementu.

((b, c) | (b, d))

Tato specifikace nevyhovuje jednoznačnému modelu obsahu, protože při zpracovávání elementu b v dokumentu není jasné, jestli patří do skupiny (b, c) nebo do skupiny (b, d), pokud neznáme, jaký element v dokumentu následuje. Jednoznačnému modelu obsahu by vyhovovala tato specifikace obsahu:

(b, (c | d))

Jinými slovy, jednoznačný model obsahu je takový, ve kterém je možné u aktuálního elementu jednoznačně určit, do které části modelu obsahu elementu patří, i bez informace o poloze ostatních elementů.

Tolik tedy o deklaraci elementů. V přístím dílu navážeme deklarací atributů v DTD.

Váš názor Další článek: Hra s čísly v podání RIAA

Témata článku: Software, Programování, Získaný klíč, Domek, Význam, Deklarovaná data, Obsah, Nuance, Code, XML, Celá skupina, Element, Zjednodušený příklad, Info, Teorie, Zvláštní význam

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


Aktuální číslo časopisu Computer

Test 6 odolných telefonů a 22 powerbank

Srovnání technologií QLED a OLED

Měřte své sportovní výkony

Sady pro chytrou domácnost