Datové typy

Možnosti datových typů jsou v XML schématech tak velké, že si vyžádaly samostatnou specifikaci. Kromě atributů můžeme nyní typ určit i u elementů, což je oproti DTD velký krok kupředu. K dispozici máme samozřejmě běžné datové typy jako celá čísla, desetinná čísla, textové řetězce, datum, čas, logická hodnota nebo internetová adresa.

Od těchto základních typů si můžeme odvozovat naše vlastní. Asi nejjednodušším způsobem odvození typu, je určení minimální a maximální délky textových řetězců a určení intervalu pro čísla. U čísel můžeme určovat i jejich rozsah a počet desetinných míst. Pokud bychom si chtěli vytvořit speciální typ, pro ukládání výše platu, není to žádný problém.

<datatype name="plat" source="decimal">
  <minInclusive value="0"/>
  <maxInclusive value="80000"/>
  <scale value="2"/>
</datatype>

Nově definovaný typ plat nyní můžeme používat na všech místech, kde lze použít standardní typy z XML schémat. V dokumentu pak na místech s tímto typem můžeme uvádět jen čísla v rozsahu od 0 do 80000 s dvěma desetinnými místy.

U typů odvozených od textových řetězců můžeme určovat masku, které musí řetězec vyhovět. Používají se přitom regulární výrazy, které známe z mnoha programovacích jazyků (syntaxe je asi nejvíce podobná Perlu). Pokud chceme vytvořit speciální typ pro IČO, které má osm číslic, není nic snazšího:

<datatype name="ičo" source="string">
  <pattern value="\d{8}"/>
</datatype>

Při definici můžeme samozřejmě definovat přípustné hodnoty pomocí výčtu.

<datatype name="kódMěny" source="string">
  <enumeration value="CZK"/>
  <enumeration value="DEM"/>
  <enumeration value="USD"/>
</datatype>

Oproti DTD nabízejí XML schémata mnohá vylepšení a to jsme zdaleka nepopsali všechny jejich možnosti. XML schémata umožňují dokonce definovat referenční integritu v rámci XML dokumentu. Několik databázových tabulek proto můžeme uložit do jednoho souboru, včetně případných vztahů.

Příklad 1. Schéma pro zápis faktur – faktura.xsd

<?xml version="1.0" encoding="utf-8"?>
<schema xmlns="http://www.w3.org/1999/XMLSchema">

 <element name="faktura">
  <type>
   <element name="odberatel" type="subjektInfoTyp"/>
   <element name="dodavatel" type="subjektInfoTyp"/>
   <element ref="polozka" minOccurs='1' maxOccurs='*'/>
   <attribute name="xmlns" type="uri"/>
   <attribute name="cislo" type="cisloFakturyTyp" minOccurs="1"/>
   <attribute name="vystaveni" type="date" minOccurs="1"/>
   <attribute name="splatnost" type="date" minOccurs="1"/>
   <attribute name="vystavil" type="string"/>
  </type>
 </element>

 <type name="subjektInfoTyp">
  <element name="nazev" type="string"/>
  <element name="adresa" type="string"/>
  <element name="ico" type="icoTyp"/>
  <element name="dic" type="dicTyp"/>
 </type>

 <datatype name="icoTyp" source="string">
  <pattern value="\d{8}"/>
 </datatype>

 <datatype name="dicTyp" source="string">
  <pattern value="\d{3}-\{8}"/>
 </datatype>

 <element name="polozka">
  <type>
   <element name="popis" type="string" minOccurs='0' maxOccurs='1'/>
   <element ref="cena"/>
   <element name="dph" type="dphTyp"/>
   <element name="ks" type="positive-integer" minOccurs='0' maxOccurs='1'/>
  </type>
 </element>

 <element name="cena" type='│£stkaTyp'>
  <type>
   <attribute name="mena" type="k￳dM↓nyTyp"/>
  </type>
 </element>

 <datatype name="│£stkaTyp" source="decimal">
  <precision value="10"/>
  <scale value="2"/>
 </datatype>

 <datatype name="k￳dM↓nyTyp" source="string">
   <enumeration value="CZK"/>
   <enumeration value="DEM"/>
   <enumeration value="USD"/>
 </datatype>

 <datatype name="dphTyp" source="decimal">
  <precision value="2"/>
  <scale value="2"/>
 </datatype>

</schema>

Ukázkové schéma je obdobou DTD z předešlého čísla, které definovalo strukturu dokumentu pro zápis faktur. Schéma, kterému dokument vyhovuje se nejčastěji připojuje pomocí jmenného prostoru (atributu xmlns).

<faktura xmlns="faktura.xsd">
  ...
</faktura>
© Jiří Kosek 2000-2001