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