Je to více než rok, kdy byl vydán článek o zápisu elementů v DTD pro XML. Pokusím se na tento článek plynule navázat dalším pokračováním, abyste měli ucelenou představu o tvorbě definice typu dokumentu pro vlastní varianty jazyků, odvozených od obecné normy XML.

Deklarace atributů

Každý element může obsahovat libovolné množství atributů. Atributy znáte i z HTML, např. tag <IMG> má atributy SRC, ALT, BORDER a jiné. Atributy slouží pro doplnění, resp. upřesnění informací o daném tagu. Například máme-li element KNIHA, tak jeho doplňující informací může být číslo knihy, tj. <KNIHA CISLO=“12″>. Atribut CISLO má samozřejmě význam pro strojové zpracování. Lze chápat jako „vnitřní“ číslo knihy v databázi.

Deklarace atributů vypadá následovně:

<!ATTLIST jméno_elementu deklarace_atributů>

Nejprve je uvedeno klíčové slovo ATTLIST, které říká, že se bude deklarovat atribut. Za ním následuje jméno elementu, pro který definujeme atributy. Deklarace atributů je seznam trojic „jmeno typ hodnota“. Každý atribut má svoje pojmenování a dále se musí specifikovat, jakého typu je. Třetí argument nemusí být vždy uveden a určuje standardní hodnotu atributu. Na zápis jména atributu se vztahují podobná pravidla jako pro zápis jmen elementů.

Typy atributů

V XML můžeme použít několika typů:

  • CDATA – nejobecnější typ, atribut tohoto typu může nabývat hodnoty libovolného řetězce.
  • NMTOKEN – hodnotou může být řetězec složený pouze z písmen, číslic a podtržítka, nesmí obsahovat mezeru ani speciální znaky
  • NMTOKENS – totéž co NMTOKEN, může být obsaženo více slov oddělených mezerou.
  • ID – atribut musí mít jedinečnou hodnotu v rámci dokumentu
  • IDREF – musí odkazovat na již použitou hodnotu ID v rámci dokumentu
  • IDREFS – může obsahovat více odkazovaných ID oddělených mezerou

Standardní hodnota atributu

Posledním prvkem v deklaraci atributu je standardní hodnota. Zde může být uvedena např. implicitní hodnota, nebo výčet hodnot, kterých může atribut nabývat. Na závěr může být uvedeno jedno z uvedených klíčových slov:

  • #REQUIRED – je požadováno, aby hodnota atributu byla zadána
  • #IMPLIED – aplikace předpokládá implicitní nastavení prostředí (hodnota se pak vezme z prostředí)
  • #FIXED – hodnota je zafixována, tj. může nabývat právě této hodnoty a žádné jiné

Příklady

<!ATTLIST NADPIS
        ZAROVNANI (LEFT|RIGHT|CENTER|JUSTIFY) #REQUIED
        TEXT CDATA „Velký nadpis 1“
        PODTEXT #FIXED „podtržení“>
<!ATTLIST CLANEK
        NADPIS CDATA #REQUIRED
        JAZYK (cs|en|fr|de|sp) „cs“ #REQUIRED
        POZNAMKA CDATA #IMPLIED>
<!ATTLIST OBRAZEK
        ROZMERY NMTOKENS #REQUIRED>

Použití definovaných tagů by mohlo vypadat následovně:

<NADPIS ZAROVNANI=“RIGHT“ TEXT=“Aplikace XML“ PODTEXT=“podtržení“/>
<CLANEK NADPIS=“DTD 2. část – atributy“ JAZYK=“cs“ POZNAMKA=““/>
<OBRAZEK ROZMERY=“10cm 20cm“/>

Několikanásobná deklarace

V DTD lze, ale není to obecně doporučováno, deklarovat atributy daného elementu i vícekrát, nebo deklaraci rozdělit do několika deklarací. V každém případě, jednotlivé deklarace se kombinují dohromady a pokud se deklaroval jeden atribut vícekrát, bere se v úvahu první deklarace, jak je názorně vidět na následujícím příkladu:

<!ATTLIST OSOBA
        JMENO CDATA
        PRIJMENI CDATA #REQUIRED
        POHLAVI (muz|zena) #REQUIED>
<!ATTLIST OSOBA
        POHLAVI (male|female) #REQUIED
        RODNE_C CDATA #REQUIED>

Element OSOBA má definovány celkem 4 atributy. Atribut POHLAVI byl deklarován dvakrát, v úvahu se bere první definice. Správné použití ukazuje následující příklad:

<OSOBA JMENO=“Jan“ PRIJMENI=“Novák“ POHLAVI=“muz“ RODNE_C=“111111/1111″/>

Společné atributy

V DTD může někdy nastat situace, že budeme mít několik atributů (skupinu), která bude společná pro více elementů. Mějme následující příklad fragmentu DTD dokumentu:

<ELEMENT osoba (jmeno, prijmeni)>
<ELEMENT jmeno (#PCDATA)>
<ELEMENT prijmeni (#PCDATA)>
<!ATTLIST jmeno
        cz_text CDATA #REQUIRED
        en_text CDATA
        cz_zkratka CDATA
        en_zkratka CDATA>

<!ATTLIST prijmeni
        cz_text CDATA #REQUIRED
        en_text CDATA
        cz_zkratka CDATA
        en_zkratka CDATA
        id ID #REQUIRED>

V uvedené části DTD jsou dva elementy, které mají společné čtyři atributy, příjmení má navíc ještě atribut ID. Obecně bychom mohli mít DTD, kde by se takové části společných atributů opakovaly mnohem více, proto je někdy lepší použít jiného zápisu, pomocí tzv. parametrových entit. Jejich použití ukazuje následující příklad:

<!ENTITY % moje_atributy
        „cz_text CDATA #REQUIRED
        en_text CDATA
        cz_zkratka CDATA
        en_zkratka CDATA“>

<ELEMENT osoba (jmeno, prijmeni)>
<ELEMENT jmeno (#PCDATA)>
<ELEMENT prijmeni (#PCDATA)>
<!ATTLIST jmeno %moje_atributy>
<!ATTLIST prijmeni %moje_atributy;
        id ID #REQUIRED>

Nejprve jsem pomocí ENTITY nadefinoval skupinu atributů, která je společná pro oba elementy a pak jsem tuto definici využil v deklaraci atributů. Z příkladu je patrná i syntaxe zápisu a použití parametrových entit.

Na závěr ještě uvedu jednu důležitou poznámku. Při zápisu atributů záleží na velikosti písmen. Tzn. že „JMENO“ a „Jmeno“ jsou dva různé atributy.

Žádný příspěvek v diskuzi

Odpovědět