Jazyk XML se i přes mnoho skeptických hlasů výrazně prosadil a mezi IT technologiemi již zaujímá pevné místo. K hlavním oblastem jeho využití patří výměna dat mezi informačními systémy. XML se prosadilo především díky své jednoduchosti a flexibilitě, která spočívá v možnosti snadného zachycení běžných datových struktur do podoby XML zprávy.
Počáteční nadšení z toho, že XML dokumenty mohou mít libovolnou strukturu a že v nich lze používat libovolné značky, však brzy vystřídá vystřízlivění. Příliš volnosti škodí a v praxi je potřeba vyměňovat si XML zprávy s nějakou předem definovanou podobou, a ne jen nahodile pojmenované směsice elementů XML. A to je právě oblast, kde do hry vstupují jazyky pro popis schématu dokumentu XML. Tyto jazyky umožňují definovat jaké elementy a atributy můžeme v XML dokumentu používat, jak je lze vzájemně kombinovat, co mohou obsahovat. Schéma dokumentu XML vlastně definuje nový značkovací jazyk, který má syntaxi XML, ale používá námi vytvořené značky. Takto definovaných jazyků existují na světě tisíce, z těch nejznámějších jmenujme například WML (wapové stránky pro mobilní telefony), XHTML (nástupce jazyka HTML), SVG (vektorový grafický formát), MathML (zápis matematických výrazů) a DocBook (tvorba dokumentace). Schéma dokumentu XML tak plní podobnou funkci jako schéma databáze ve světě relačních databázových systémů.
Primární význam schémat leží v jejich použití pro formální definici značkovacích jazyků, nebo chcete-li datových formátů, založených na XML. Výhoda formalizované definice spočívá v tom, že je jednoznačná a znemožňuje různé interpretace, na rozdíl od definice popsané v přirozeném jazyce. Všichni, kdo chtějí dokumenty XML odpovídající danému schématu zpracovávat, proto vědí, jak mohou dokumenty vypadat.
Vzhledem k tomu, že schéma jednoznačně definuje, jak může dokument XML vypadat, můžeme jej samozřejmě použít i pro validaci. Ostatně se jedná asi o nejčastější použití schémat. Validace je proces, při kterém se ověřuje, zda nějaký konkrétní dokument XML vyhovuje všem omezením definovaným ve schématu. Můžeme si tak například ověřit, zda dokument, který nám někdo zaslal, opravdu vyhovuje formátu, na němž jsme se předtím domluvili. Další výhodou validace je ulehčení vývoje aplikací. Ty nemusí při čtení dat z XML provádět kontrolu správného vstupu, protože většinu případných chyb odhalí validace.
Některé jazyky pro popis schématu umožňují pro obsah jednotlivých elementů a atributů určit jejich datový typ, jako číslo, řetězec, datum apod. Během validace pak může být jednotlivým částem XML dokumentu přiřazen jejich datový typ. Aplikace pak při čtení dokumentu pracuje rovnou s otypovaným daty a ne jen s textovými řetězci, jak je ve světě XML běžné. Z abstraktního datového modelu XML (tzv. infoset) se po přiřazení typů stane PSVI (Post-Schema Validation Infoset).
Schéma dokumentu může být využito jako zdroj pro vytvoření odpovídajícího objektového modelu včetně kódu, který jej implementuje. Princip databindingu spočívá v tom, že pomocí automaticky vygenerovaného kódu ze schématu můžeme pak v aplikaci snadno manipulovat s dokumenty XML, které budou reprezentovány jako sada objektů v paměti.
V neposlední řadě slouží schéma jako dokumentace pro značkovací jazyk, který definuje. Navíc pro mnoho jazyků pro popis schématu existují nástroje, které z původního schématu vygenerují přehlednou dokumentaci například v podobě hypertextově provázaných webových stránek.
Přímo specifikace jazyka XML [2] popisuje DTD (Document Type Definition), což je jazyk pro popis schématu dokumentu pocházející ještě z jazyka SGML. DTD díky tomu mají jednu velkou výhodu – podporuje je velké množství aplikací. To je však současně jejich jedinou výhodou.
S rozšiřováním XML začínaly být nedostatky DTD stále patrnější. Za největší nedostatek můžeme označit nulovou podporu pro jmenné prostory. Jmenné prostory jsou mechanismus, který umožňuje v jednom dokumentu XML kombinovat více sad značek – např. do webové stránky v XHTML můžeme vložit obrázek v SVG a matematickou rovnici zapsanou v MathML.
Druhým nedostatkem je nemožnost určení datového typu pro obsah elementů a atributů. SGML, a později XML, bylo primárně navrženo pro značkování dokumentů textové povahy jako jsou knihy, technická dokumentace, články, webové stránky apod. V těchto dokumentech je v podstatě vše text. XML se však začalo masově používat i na výměnu strukturovaných dat mezi informačními systémy. V dokumentech jako faktura, stav zboží na skladě nebo kurzový lístek už zdaleka vše není jen text – kromě toho tu jsou číselné hodnoty, měnové údaje, data apod. Aby byla validace skutečně účinná, je potřeba omezit nejen strukturu vzájemného zanoření elementů, což DTD ještě umí, ale i obsah těchto elementů (a případně i atributů) jejich datovým typem.
Třetí slabina DTD již není tak jednoznačná. Pro zápis DTD se používá jednoduchá syntaxe připomínající regulární výrazy. Např. definovat element pro fakturu, která se skládá z dodavatele, odběratele a několika položek, je velmi jednoduché:
<!ELEMENT faktura (dodavatel, odberatel, polozka+)>
Problém je však v tom, že tento jednoduchý a kompaktní zápis používá syntaxi, která se nikde jinde v XML nepoužívá. Proto snad všechny jazyky pro popis schématu dokumentu, které přišly až po DTD, pro zápis schématu používají přímo XML. Zápis je pak sice delší a mnohdy méně přehlednější, ale se schématem lze pracovat stejně jako s jakýmkoliv jiným dokumentem XML – můžeme z něj například snadno pomocí XSLT generovat dokumentaci. Otevírá se tak i prostor pro grafické návrháře schémat, podobně jako lze použít CASE nástroje pro vytvoření datového modelu pro relační databázi.
Předchozí tři důvody byly natolik závažné, že se již v době vzniku standardu XML začalo pracovat na několika nových schémových jazycích, které měly překonat výše popsaná omezení. Většina z těchto jazyků nepřežila více než jen několik málo let nebo se jedná o proprietární jazyky používané pouze omezeným počtem firem.
Významnou roli však hrál jazyk XML-Data, který společenství několika firem zaslalo na začátku roku 1998 do W3C jako návrh. XML-Data nebyl ani příliš striktně vázán na XML, šlo o jazyk, který umožňoval definovat charakteristiky tříd objektů. Pro ověření použitelnosti byl však návrh příliš složitý, a proto vznikla ještě jeho zjednodušená verze XDR (XML-Data Reduced). Právě XDR ve svých produktech používal Microsoft, dokud nebyl přijat nějaký všeobecně uznávaný standard. Tím se v květnu 2001 stal jazyk XML Schema přijatý jako doporučení konsorcia W3C.[1]
XML schéma se samozřejmě vyvinulo z XML-Data a XDR. Po DTD je to dnes nejpoužívanější schémový jazyk a podporují jej všechny velké firmy a mnoho projektů open-source. Jediným problémem XML schémat je poněkud složitá specifikace a některá poněkud temná zákoutí jazyka. Nicméně po přečtení tohoto materiálu byste měli znát dost na to, abyste mohli XML schéma uspokojivě využívat.
XML schémata jsou sice pro mnoho věcí zcela dostačující a použitelná, ale přece jen jim chybí určitá elegance. Jako reakce na tento stav vznikl další schémový jazyk Relax NG. Jeho popularita v poslední době hodně roste, protože je velmi jednoduchý na naučení a na použití a počet jeho implementací se rozšiřuje. Relax NG je od roku 2001 standardizován na půdě sdružení OASIS a od roku 2003 je i normou ISO.
Výše popsané jazyky přistupují k tvorbě schématu systematicky – v případě DTD a Relax NG vytváříme gramatiku nového jazyka, XML schémata pak definují typy, které musí dokument obsahovat. Někdy však může být výhodné využití jiného a méně systematického přístupu, který však umí postihnout zcela jiné aspekty. Jedním z takových jazyků je Schematron, který umožňuje definovat sadu podmínek, které musí být pro dokument splněny. Schematronové schéma tedy nejde použít pro nic jiného než pro validaci, ale díky použití jazyka XPath jako základu pro zápis podmínek, máme v ruce velmi silný nástroj. Žádný z předchozích jazyků neumožňuje například popsat taková omezení, kdy obsah jednoho elementu musí obsahovat větší hodnotu než obsah jiného elementu, nebo vztahy mezi daty uloženými v několika dokumentech.
Vzhledem ke svým vlastnostem bývá Schematron často používán jen jako doplněk ke klasickým schématům. XML schéma i Relax NG nabízejí možnosti, jak přímo do schématu vložit schematronovské výroky.
Existence několika konkurenčních schémových jazyků naznačuje, že se každý hodí na něco trochu jiného a nejde tedy očekávat, že za pár let jeden z jazyků převáží nad ostatními. Ukazuje se spíše, že je vhodné jazyky navzájem kombinovat. Aby existoval nějaký jednotný rámec, jak popsat vícenásobnou validaci dokumentů, vzniká na půdě ISO nový projekt DSDL (Document Schema Definition Languages). Jeho cílem je jednak kodifikovat jazyky jako Relax NG a Schematron do podoby ISO norem a hlavně vytvořit standardní prostředí pro validaci dokumentu oproti několika schématům. Není to lehký úkol, protože dokumenty používající více jmenných prostorů musí být před validací obvykle rozebrány na několik samostatných fragmentů.
Před podrobnějším výkladem jednotlivých schémových jazyků si na jednoduchém příkladě ukážeme základní vlastnosti jednotlivých jazyků. Předpokládejme, že potřebujeme vytvořit schéma pro následující XML dokument s informacemi o zaměstnancích.
Příklad 1.1. Ukázkový dokument XML –
uvod/zamestnanci.xml
<?xml version="1.0" encoding="utf-8"?> <zamestnanci> <zamestnanec id="101"> <jmeno>Jan</jmeno> <prijmeni>Novák</prijmeni> <email>jan@novak.cz</email> <email>jan.novak@firma.cz</email> <plat>25000</plat> <narozen>1965-12-24</narozen> </zamestnanec> <zamestnanec id="102"> <jmeno>Petra</jmeno> <prijmeni>Procházková</prijmeni> <email>prochazkovap@firma.cz</email> <plat>27500</plat> <narozen>1974-12-21</narozen> </zamestnanec> </zamestnanci>
Schéma vyjádřené pomocí DTD neumožňuje definovat datový typ jednotlivých elementů, ale je poměrně jednoduché.
Příklad 1.2. Ukázka DTD – uvod/zamestnanci.dtd
d
t
d<!ELEMENT zamestnanci (zamestnanec+)>
<!ELEMENT zamestnanec (jmeno, prijmeni, email+,
plat?, narozen)>
<!ELEMENT jmeno (#PCDATA)>
<!ELEMENT prijmeni (#PCDATA)>
<!ELEMENT email (#PCDATA)>
<!ELEMENT plat (#PCDATA)>
<!ELEMENT narozen (#PCDATA)>
<!ATTLIST zamestnanec
id CDATA #REQUIRED>
XML schéma už umožňuje pro jednotlivé elementy definovat jejich datový typ a celé je zapsáno syntaxí XML. Výsledkem je však poměrně výřečný dokument, který není moc pohodlné psát přímo v ruce bez pomoci specializovaných editorů schémat.
Příklad 1.3. Ukázka W3C XML Schema –
uvod/zamestnanci.xsd
W
X
S<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="zamestnanci"> <xs:complexType> <xs:sequence> <xs:element name="zamestnanec" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="jmeno" type="xs:string"/> <xs:element name="prijmeni" type="xs:string"/> <xs:element name="email" type="xs:string" maxOccurs="unbounded"/> <xs:element name="plat" type="xs:decimal" minOccurs="0"/> <xs:element name="narozen" type="xs:date"/> </xs:sequence> <xs:attribute name="id" type="xs:int" use="required"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Relax NG samo o sobě nepodporuje datové typy, ale lze o tuto podporu rozšířit. Standardně se zapisuje rovněž v XML syntaxi, která je však poměrně stručná a navíc sjednocuje přístup k atributům a elementům.
Příklad 1.4. Ukázka Relax NG schématu –
uvod/zamestnanci.rng
r
n
g<?xml version="1.0" encoding="utf-8"?> <element xmlns="http://relaxng.org/ns/structure/1.0" name="zamestnanci"> <oneOrMore> <element name="zamestnanec"> <attribute name="id"> <text/> </attribute> <element name="jmeno"> <text/> </element> <element name="prijmeni"> <text/> </element> <oneOrMore> <element name="email"> <text/> </element> </oneOrMore> <optional> <element name="plat"> <text/> </element> </optional> <element name="narozen"> <text/> </element> </element> </oneOrMore> </element>
Relax NG lze zapisovat i v kompaktní textové syntaxi (RNC), která je velmi úsporná a zápis schématu je pak hračkou i v obyčejném textovém editoru.
Příklad 1.5. Ukázka Relax NG schématu v kompaktní syntaxi –
uvod/zamestnanci.rnc
r
n
celement zamestnanci {
element zamestnanec {
attribute id { text },
element jmeno { text },
element prijmeni { text },
element email { text }+,
element plat { text }?,
element narozen { text }
}+
}
Relax NG schéma může používat různé typové systémy, mj. i typový systém XML schémat. Můžeme tak vytvořit schéma, které pro náš seznam zaměstnanců definuje i datové typy.
Příklad 1.6. Ukázka Relax NG schématu s datovými typy –
uvod/zamestnanci2.rng
r
n
g<?xml version="1.0" encoding="utf-8"?> <element xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" name="zamestnanci"> <oneOrMore> <element name="zamestnanec"> <attribute name="id"> <data type="int"/> </attribute> <element name="jmeno"> <data type="string"/> </element> <element name="prijmeni"> <data type="string"/> </element> <oneOrMore> <element name="email"> <data type="string"/> </element> </oneOrMore> <optional> <element name="plat"> <data type="decimal"/> </element> </optional> <element name="narozen"> <data type="date"/> </element> </element> </oneOrMore> </element>
Příklad 1.7. Ukázka RNC schématu s datovými typy –
uvod/zamestnanci2.rnc
r
n
celement zamestnanci {
element zamestnanec {
attribute id { xsd:int },
element jmeno { xsd:string },
element prijmeni { xsd:string },
element email { xsd:string }+,
element plat { xsd:decimal }?,
element narozen { xsd:date }
}+
}
Schematron se od předchozích jazyků svým principem podstatně liší. Nedefinuje se v něm gramatika, ale sada podmínek, kterým musí dokument vyhovět.
Příklad 1.8. Ukázka schématu ve Schematronu –
uvod/zamestnanci.sch
s
c
h<?xml version="1.0" encoding="utf-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron"> <pattern> <title>Seznam zaměstnanců je neprázdný a máme na výplaty</title> <rule context="zamestnanci"> <assert test="zamestnanec">V seznamu musí být alespoň jeden zaměstnanec</assert> <report test="sum(zamestnanec/plat) > 500000">Součet platů nemůže být větší než 500.000,-</report> </rule> </pattern> <pattern> <title>Podmínky pro zaměstnance</title> <rule context="zamestnanec"> <assert test="@id">U zaměstnance musí být zadáno jeho osobní číslo.</assert> <report test="jmeno[2]|prijmeni[2]">Zaměstnanec nemůže mít více než jedno jméno.</report> </rule> </pattern> <pattern> <title>Duplicita osobních čísel</title> <rule context="zamestnanec"> <report test="count(../zamestnanec[@id = current()/@id]) > 1">Duplicitní osobní číslo <value-of select="@id"/> u elementu <name/>.</report> </rule> </pattern> </schema>
V současné době se pracuje na vývoji „metaschémat“, která popíší, jak se mají validovat dokumenty složené z několika částí v různých jmenných prostorech. Nejznámějším jazykem z této rodiny je NVDL (Namespace Validation and Dispatching Language).
Příklad 1.9. Ukázka NVDL schématu pro validaci XHTML+SVG dokumentů
n
v
d
l<rules xmlns="http://purl.oclc.org/dsdl/nvdl/ns/structure/1.0"> <namespace ns="http://www.w3.org/1999/xhtml"> <validate schema="xhtml.rng"> <mode> <namespace ns="http://www.w3.org/2000/svg"> <validate schema="svg.xsd"> <mode> <anyNamespace> <attach/> </anyNamespace> </mode> </validate> </namespace> </mode> </validate> </namespace> </rules>
Současná situace, kdy paralelně existuje několik schémových jazyků, staví každého vývojáře před problém, který jazyk použít. Naštěstí se ukazuje, že v praktickém životě platí jednoduchá pravidla.
Pokud v dokumentech nepotřebujeme používat jmenné prostory a datové typy, vystačíme si s DTD. Jejich použití je bezproblémové, protože jsou podporovány největším počtem aplikací. Tato situace však dnes v praxi často nenastává. Zbývá nám tedy volba mezi jazyky XML schéma a Relax NG. Rozhodování nám většinou usnadní okolní prostředí. Vývojové nástroje komerčních firem (Microsoft, IBM, Oracle, Sun) zatím podporují jen XML schémata a standardní XML knihovny rovněž. Volba je pak dána předem.
Nejsme-li však takto omezeni a spokojíme-li se s menším počtem dostupných nástrojů, je většinou jednodušší použít Relax NG. Budeme odměněni příjemným a jednoduchým jazykem. Relax NG navíc kromě „upovídané“ syntaxe XML umožňuje schéma zapsat v kompaktní textové podobě.
Současný vývoj směřuje k podpoře několika schémových jazyků, ze kterých si bude moci uživatel vybrat. Již dnes navíc existují nástroje, jako Trang, které umožňují převádět schéma z jednoho schémového jazyku do druhého. Mnoho projektů z výše popsaných pragmatických důvodů používá nebo bude používat XML schémata.
[1] Dále v textu mu budeme familiárně říkat jen XML schéma. V internetových diskusních skupinách se XML Schema často označuje pouhou zkratkou WXS vzniklou z W3C XML Schema, nebo XSD podle nejčastěji používané přípony souborů.