Definice elementů

XML schémata většinou nabízejí několik možností, jak něco definovat. U elementů je asi nejjednodušší případ, když element nemůže obsahovat již žádné další elementy, pouze nějakou konkrétní hodnotu. Definice elementu nazev, který může obsahovat textový řetězec, může vypadat třeba takto:

<element name="nazev" type="string"/>

Pokud má element obsahovat ještě nějaké další vnořené elementy, uvedou se jako součást definice typu elementu.

<element name="odberatel">
  <type>
    <element name="nazev" type="string"/>
    <element name="adresa" type="string"/>
    <element name="ico" type="string"/>
    <element name="dic" type="string"/>
  </type>
</element>

Pokud by elementy nazev, adresa atd. byly nějakého složitějšího typu a obsahovaly by další elementy, použil by se v definici elementu pouze odkaz na jejich podrobnou definici.

<element name="odberatel">
  <type>
    <element ref="nazev"/>
    <element ref="adresa"/>
    <element ref="ico"/>
    <element ref="dic"/>
  </type>
</element>

<element name="nazev" type="string"/>

<element name="adresa" type="string"/>

<element name="ico" type="string"/>

<element name="dic" type="string"/>

Narozdíl od DTD je ve schématech velice jednoduché určit počet opakování nějakého elementu. Slouží k tomu atributy minOccurs a maxOccurs, který určují minimální a maximální počet výskytů. Můžeme v nich použít libovolné hodnoty, u maxOccurs můžeme navíc uvést i hodnotu *, která zastupuje nekonečno.

<element name="faktura">
  <type>
    <element ref="odberatel"/>
    <element ref="dodavatel"/>
    <element ref="polozka" minOccurs="1" maxOccurs="*"/>
  </type>
</element>

Samozřejmě, že můžeme vytvářet i složitější modely obsahu. Pokud bychom chtěli vytvořit element para se smíšeným obsahem, použijeme přídavný atribut u definice typu elementu:

<element name="para">
  <type content="mixed">
    <element name="em" type="string"/>
  </type>
</element>

Obvykle se mají elementy v dokumentu vyskytovat v pořadí, které specifikujeme ve schématu. Někdy se může hodit, aby se vyskytly v libovolném pořadí. Třeba u jména je nám jedno, zda je nejprve uvedeno křestní jméno nebo příjmení. Tuto možnost nám již DTD v XML nenabízejí.

<element name="jméno">
  <type>
    <group order="all">
      <element name="křestní" type="string"/>
      <element name="příjmení" type="string"/>
    </group>
  </type>
</element>

Element group může v atributu order obsahovat ještě hodnoty seq a choice. První z nich říká, že elementy se musí v dokumentu vyskytovat ve stejném pořadí jako ve schématu. Druhá varianta pak říká, že v dokumentu se smí vyskytnout jen jeden z elementů definovaných ve skupině. Samozřejmě, že skupiny lze podle potřeby do sebe vzájemně zanořovat.

© Jiří Kosek 2000-2001