NVDL (Namespace-based Validation Dispatching Language)[10] je nový schémový jazyk, který zastřešuje všechny stávající schémové jazyky a dovoluje je navzájem kombinovat. Zároveň tím řeší některé problémy a nedostatky klasických schémových jazyků.
Ač je dnes situace na poli schémových jazyků mnohem jednodušší, než na přelomu tisíciletí, kdy jich existovalo a používalo se několik desítek, přesto se nedá říci, že by současné schémové jazyky uspokojivě pokrývaly všechny potřeby uživatelů.
Jednotlivé schémové jazyky byly navrhovány s různými cíli, a liší se proto i jejich schopnost popsat různá omezení, která musí dokument XML splňovat. Pro důkladnější kontrolu je většinou potřeba použít dvě schémata – jedno založené na gramatice a druhé na pravidlech. V praxi se tak nejčastěji setkáme s kombinací RELAX NG + Schematron nebo W3C XML schéma a Schematron.
Potřebovali bychom proto mechanismus, který by snadno dovolil říci, že dokument se má validovat vůči dvěma či více schématům najednou. Mechanismus by přitom měl být dostatečně univerzální a měl by podporovat libovolnou kombinaci schémových jazyků.[6]
Chceme-li při zpracování dokumentu využívat jeho schéma, potřebujeme mechanismus, který určí, jaké schéma se má použít. Dříve bylo poměrně časté schéma určovat přímo uvnitř dokumentu XML. Pro DTD bylo možné využít deklaraci typu dokumentu:
<!DOCTYPE book SYSTEM "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
XML schémata pak přišla s globálními atributy schemaLocation
a noNamespaceSchemaLocation
:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/1999/xhtml http://www.w3.org/2002/08/xhtml/xhtml1-transitional.xsd">
Existuje i speciální instrukce pro zpracování, kterou lze použít s jakýmkoliv schémovým jazykem:
<?xml-model href="xhtml.rnc" type="application/relax-ng-compact-syntax"?> <html xmlns="http://www.w3.org/1999/xhtml"> … </html>
Historie však ukazuje, že takovýto přístup není vhodný. Schémové jazyky se neustále vyvíjejí, vylepšují a vznikají nové s ještě silnějšími vyjadřovacími prostředky. Oproti tomu samotné dokumenty XML mají poměrně dlouhou životnost. Je proto velice pravděpodobné, že v průběhu životního cyklu dokumentu budeme chtít změnit schéma, vůči kterému dokument validujeme. Pokud je však odkaz na schéma vložen přímo do dokumentu, musíme modifikovat původní dokument, což je nepříjemné a mnohdy dokonce zcela nežádoucí.
Dalším problém je bezpečnost při zpracování dokumentů odkazujících na schéma. XML je dnes často používáno pro výměnu dat, kde koncový bod přijímá data, provede jejich validaci a pak je předá aplikaci k vlastnímu zpracování. Pokud se však validace řídí schématem určeným v instanci dokumentu, není problém poslat zprávu, která je nesmyslná, ale odkazuje na vlastní schéma, vůči kterému je validní. Aplikace pak není validací chráněna a ke zpracování dostane data, se kterými nepočítá, což může vést ke vzniku chyb a nekonzistentních stavů.
Ve většině případů je proto vhodné, aby schéma bylo určeno externě nezávisle na dokumentu XML. Jako ideální se ukazuje mapovací tabulka, která na základě jmenného prostoru a případně dalších charakteristik přiřadí dokumentu schéma.
Komponované dokumenty jsou ty dokumenty, které používají elementy z několika jmenných prostorů najednou. V posledních letech vzrůstá jejich obliba, což je zcela pochopitelné. Do XML se ukládají stále komplexnější informace, a bylo by mrhání časem vymýšlet stejné věci pořád dokola, ale trochu jinak. Pokud tedy v našem typu dokumentu potřebujeme ukládat data, pro která již existuje formát založený XML, použijeme jej.
Nevznikají tak velká a složitá monolitická schémata, ale dokument je složen z menších specializovaných částí. Do jisté míry je možné tento vývoj srovnat s oblibou komponentově orientovaného vývoje software. Jednotlivé specializované jazyky XML lze chápat, jako komponenty, ze kterých se složí výsledný dokument. Programové komponenty podporující zpracování jednotlivých jazyků se pak často použití při zpracování komponovaného dokumentu.
Asi největší propagace se myšlenka komponovaných dokumentů dočkala na webu, byť podpora v prohlížečích zatím není zdaleka ideální. Do jazyka XHTML lze vkládat podle potřeby kusy kódu v jiných specializovaných jazycích a dosáhnout tak potřebné funkcionality. Jaké jazyky má smysl míchat v jednom dokumentu s XHTML? Nejčastěji bývají jako příklad uváděny jazyky SVG a MathML, které slouží pro reprezentaci vektorových obrázků a matematických vzorců. Existuje však mnoho dalších smysluplných kombinací. Do XHTML stránky můžeme pomocí elementů a atributů SMIL nastavit časový průběh zobrazování jednotlivých částí stránky. Pomocí VoiceXML můžeme do stránky vložit formulář pro hlasovou interakci s uživatelem. Běžný formulář můžeme vložit pomocí jazyka XForms, přídavná metadata můžeme vkládat přímo v RDF. Smysluplných možností je opravdu mnoho a záleží jen na naší představivosti (a schopnosti aplikací takové dokumenty zpracovat).
Následující příklad ukazuje komponovaný dokument, kde je do XHTML stránky vložen obrázek v SVG. Všimněme si, že elementy XHTML a SVG jsou odlišeny právě pomocí svých jmenných prostorů.
Příklad 6.1. Ukázka komponovaného dokument XHTML + SVG
<?xml version="1.0" encoding="utf-8"?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg"> <head> <title>Ukázka SVG obrázku</title> </head> <body> <h1>Vektorový obrázek v SVG</h1> <svg:svg width="4in" height="3in"> <svg:g> <svg:circle style="fill: yellow; stroke: red" cx="200" cy="200" r="150"/> <svg:text x="80" y="200" style="font-size: 36px; font-family: Verdana; color: red; fill: red" >Dobrou chuť</svg:text> </svg:g> </svg:svg> </body> </html>
Komponované dokumenty se zcela běžně používají pro tiskové výstupy XML, které jsou definovány pomocí jazyka XSL-FO, do kterého jsou grafika a grafy vložena jako fragmenty SVG. V poslední době je mnoho pozornosti věnováno formátům kancelářských balíků. Oba dva formáty Open Document Format i Office Open XML jsou ve skutečnosti komponované dokumenty. XML se velice často používá pro komunikaci mezi aplikacemi. Webové služby zasílané zprávy vkládají do obálky SOAP – výsledná SOAP zpráva je tak vždy rovněž komponovaný dokument.
Je jasné, že pokud ne již dnes, tak v brzké budoucnosti budou většinu obsahu v XML tvořit právě komponované dokumenty. Je tedy potřeba, aby nástroje umožnily snadné a plnohodnotné zpracování takových dokumentů.
Oba dva jazyky W3C XML Schema a RELAX NG umožňují vytvářet schémata pro dokumenty obsahující elementy z více jmenných prostorů. Čistě teoreticky tak nic nebrání tomu, aby se v těchto jazycích vytvářela schémata pro komponované dokumenty. Výhoda komponovaných dokumentů však spočívá v možnosti opakovaného využití již existujícího. Budeme-li chtít vytvořit schéma pro XHTML+SVG, nebudeme chtít psát celé schéma od začátku, ale vzít již existující samostatná témata pro XHTML a SVG a ta zkombinovat dohromady.
Zkombinování dvou schémat dohromady však není vždy jednoduché. Aby šlo schémata navzájem kombinovat, musí být zapsána ve stejném jazyce. Těžko bychom mohli navzájem kombinovat schéma v RELAX NG se schématem W3C XML Schema. Schémata lze sice mezi jednotlivými jazyky konvertovat, ale konverze není vždy bezztrátová, protože jednotlivé schémové jazyky mají odlišnou vyjadřovací sílu.
I když máme schémata v jednom jazyce, ještě není vyhráno. Aby šlo schémata kombinovat musí být navržena modulárně. Jedině tak, lze jednoduše rozšiřovat již existující definice elementů o elementy z jiných jmenných prostorů. V praxi to vyžaduje, aby schémata v maximálně možné míře využívala pojmenované vzory (RELAX NG) nebo substituční skupiny (W3C XML Schema).
Jsou-li výše uvedené předpoklady splněny a my se dokážeme v cizích schématech zorientovat, je možné sestavit schéma pro komponovaný dokument. Nicméně pro větší počet jazyků než dva či tři se úloha většinou stává velice komplikovanou.
Mnoho z výše uvedených problémů řeší nový schémový (či spíše meta-schémový) jazyk NVDL (Namespace-based Validation Dispatching Language)[10]. Jazyk NVDL je mezinárodní normou ISO/IEC 19757-4 přijatou v roce 2006. Nicméně nevznikl na zelené louce, ale evolucí z předchozích projektů NRL (Namespace Routing Language), MNS (Modular Namespaces), RELAX Namespace a Namespace Switchboard.
NVDL umožňuje na jednom místě určit, vůči jakým schématům se mají validovat elementy z jednotlivých jmenných prostorů a jak mohou být jmenné prostory navzájem kombinovány.
Následující schéma ukazuje, jak je v NVDL jednoduché říci, že XHTML dokumenty se mají validovat najednou vůči dvěma schématům v různých jazycích (W3C XML Schema a Schematron).
Příklad 6.2. Validace jednoho dokumentu vůči více schématům
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="xhtml1-transitional.xsd"/> <validate schema="xhtml.sch"/> </namespace> </rules>
NVDL však bylo navrženo zejména pro validaci komponovaných dokumentů. Následující příklad ukazuje, jak jednoduše můžeme říci, vůči jakým schématům se mají validovat elementy z jednotlivých jmenných prostorů (v našem případě se jedná o XHTML a SVG).
Příklad 6.3. Jednoduché schéma pro XHTML+SVG komponované dokumenty
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.xsd"/> </namespace> <namespace ns="http://www.w3.org/2000/svg"> <validate schema="svg.rng"/> </namespace> </rules>
Navíc je vidět, že schéma pro jednotlivé jazyky může být zapsáno v rozdílných schémových jazycích. Jmenné prostory, pro které schéma neurčíme, jsou při výchozím nastavení zakázané a vyvolají chybu validace.
Proces validace vůči NVDL schématu je proces skládající se z několika postupně navazujících kroků:
rozdělení dokumentu do sekcí (nezávislé na NVDL schématu)
přiřazení akcí jednotlivým sekcím (vytvoření interpretací)
kombinování a filtrování sekcí
validace fragmentů vůči dílčím schématům
Před validací se dokument rozdělí do sekcí. Toto dělení je nezávislé na použitém NVDL schématu. Samostatnou sekci vytvoří každý element a jeho potomci, kteří používají jiný jmenný prostor než rodičovský element. Vše ilustruje následující příklad.
Příklad 6.4. Jednoduchý XHTML + SVG dokument
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg"> <head> <title>Ukázka SVG obrázku</title> </head> <body> <h1>Vektorový obrázek v SVG</h1> <svg:svg width="4in" height="3in"> <svg:g> <p>ahoj</p> <svg:circle style="fill: yellow; stroke: red" cx="200" cy="200" r="150"/> <svg:text x="80" y="200" style="font-size: 36px; font-family: Verdana; color: red; fill: red" >Dobrou chuť</svg:text> </svg:g> </svg:svg> </body> </html>
Příklad 6.5. Rozdělení dokumentu do sekcí
Sekce 1: <html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg"> <head> <title>Ukázka SVG obrázku</title> </head> <body> <h1>Vektorový obrázek v SVG</h1> (…odkaz na sekci 2) </body> </html> Sekce 2: <svg:svg width="4in" height="3in"> <svg:g> (… odkaz na sekci 3) <svg:circle style="fill: yellow; stroke: red" cx="200" cy="200" r="150"/> <svg:text x="80" y="200" style="font-size: 36px; font-family: Verdana; color: red; fill: red" >Dobrou chuť</svg:text> </svg:g> </svg:svg> Sekce 3: <p>ahoj</p>
Po vytvoření sekcí se na základě NVDL schématu ke každé sekci přiřadí akce. Akce může určit schéma, vůči kterému se má sekce validovat. Kromě toho některé akce dovolují před validací spojit několik sekcí zase dohromady.
Nejpoužívanější je akce validate
. Ta způsobí
to, že sekce se validuje vůči určenému schématu. Vše ukazují
následující příklady. Předpokládejme následující jednoduché schéma.
Příklad 6.6. Akce validate –
nvdl/xhtml-svg1.nvdl
n
v
d
l<?xml version="1.0" encoding="UTF-8"?> <rules xmlns="http://purl.oclc.org/dsdl/nvdl/ns/structure/1.0"> <namespace ns="http://www.w3.org/1999/xhtml"> <validate schema="../wxs/xhtml11/xhtml11.xsd"/> </namespace> <namespace ns="http://www.w3.org/2000/svg"> <validate schema="svg/svg11.rng"/> </namespace> </rules>
Jednotlivé sekce se před validací nijak nekombinují, pouze se samostatně validují vůči odpovídajícím schématům.
Sekce 1 --> xhtml.xsd: <html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg"> <head> <title>Ukázka SVG obrázku</title> </head> <body> <h1>Vektorový obrázek v SVG</h1> (…odkaz na sekci 2) </body> </html> Sekce 2 --> svg.rng: <svg:svg width="4in" height="3in"> <svg:g> (… odkaz na sekci 3) <svg:circle style="fill: yellow; stroke: red" cx="200" cy="200" r="150"/> <svg:text x="80" y="200" style="font-size: 36px; font-family: Verdana; color: red; fill: red" >Dobrou chuť</svg:text> </svg:g> </svg:svg> Sekce 3 --> xhtml.xsd: <p>ahoj</p>
Dalo by se říci, že schéma je nejspíše špatné, protože se element
p
validuje bez ohledu na místo, kde se
vyskytuje. Pravděpodobně nebudeme chtít dovolit XHTML element uvnitř
SVG obrázku, protože by se obtížně definovalo jeho
chování. Následující akce umožňují tyto aspekty detailněji kontrolovat.
Akce attach
způsobí, že před validací je
sekce připojena zpět ke své rodičovské sekci. Pro náš příklad
XHTML+SVG dokumentu by proto mnohem lepší bylo následující
schéma.
Příklad 6.7. Akce attach – nvdl/xhtml-svg2.nvdl
n
v
d
l<?xml version="1.0" encoding="UTF-8"?> <rules xmlns="http://purl.oclc.org/dsdl/nvdl/ns/structure/1.0"> <namespace ns="http://www.w3.org/1999/xhtml"> <validate schema="../wxs/xhtml11/xhtml11.xsd"> <mode> <namespace ns="http://www.w3.org/2000/svg"> <validate schema="svg/svg11.rng"> <mode> <anyNamespace> <attach/> </anyNamespace> </mode> </validate> </namespace> </mode> </validate> </namespace> </rules>
Toto schéma říká, že dokument musí začínat XHTML sekcí, do které
mohou být vnořené sekce v SVG. Všechny cizí elementy uvnitř SVG se
před validací připojí zpět na SVG sekci (díky akci
attach
). Vycházíme přitom z předpokladu, že míchat
cizí elementy do SVG nemá smysl, a proto je věcí SVG schématu, zda
tyto elementy povolí.
Při zpracování dokumentu se jednotlivé sekce tedy nejdříve
pomocí attach
spojí do větších fragmentů a ty se
pak validují.
Fragment 1 --> xhtml.xsd: <html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg"> <head> <title>Ukázka SVG obrázku</title> </head> <body> <h1>Vektorový obrázek v SVG</h1> </body> </html> Fragment 2 --> svg.rng: <svg:svg width="4in" height="3in"> <svg:g> <p>ahoj</p> <!-- Připojená XHTML sekce --> <svg:circle style="fill: yellow; stroke: red" cx="200" cy="200" r="150"/> <svg:text x="80" y="200" style="font-size: 36px; font-family: Verdana; color: red; fill: red" >Dobrou chuť</svg:text> </svg:g> </svg:svg>
V některých případech chceme, aby se při validaci některé sekce
chovaly tak, jako by v dokumentu ani nebyly. Předchozí příklad bychom
také mohli chtít validovat z pohledu aplikace, která nerozumí SVG. Pro
ní je pak důležité, jak by dokument vypadal, kdyby se vypustily všechny
elementy SVG. K tomu lze využít právě akci unwrap
,
jak ukazuje následující NVDL schéma.
Příklad 6.8. Akce unwrap – nvdl/xhtml-svg3.nvdl
n
v
d
l<?xml version="1.0" encoding="UTF-8"?> <rules xmlns="http://purl.oclc.org/dsdl/nvdl/ns/structure/1.0" startMode="xhtml"> <mode name="xhtml"> <namespace ns="http://www.w3.org/1999/xhtml"> <validate schema="../wxs/xhtml11/xhtml11.xsd" useMode="svg"/> </namespace> </mode> <mode name="svg"> <namespace ns="http://www.w3.org/1999/xhtml"> <attach/> </namespace> <namespace ns="http://www.w3.org/2000/svg"> <unwrap/> </namespace> </mode> </rules>
Dané schéma říká, že dokument musí vždy začínat XHTML
sekcí. Jakékoliv na ní napojené sekce se pak zpracovávají v režimu
svg
. Tento režim říká, že SVG elementy se zcela
ignorují (unwrap
) a XHTML elementy se napojí na
rodičovskou sekci (attach
). V praxi se tak validuje
původní dokument s odfiltrovanými SVG sekcemi.
Fragment 1 --> xhtml.xsd: <html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg"> <head> <title>Ukázka SVG obrázku</title> </head> <body> <h1>Vektorový obrázek v SVG</h1> <p>Ahoj</p> <!-- Připojená XHTML sekce --> </body> </html>
NVDL umožňuje pro každou sekci provést libovolný počet akcí najednou. Předchozí příklad tak můžeme rozšířit o to, aby se navíc SVG sekce validovaly oproti SVG schématu.
Příklad 6.9. Kombinování akcí – nvdl/xhtml-svg4.nvdl
n
v
d
l<?xml version="1.0" encoding="UTF-8"?> <rules xmlns="http://purl.oclc.org/dsdl/nvdl/ns/structure/1.0" startMode="xhtml"> <mode name="xhtml"> <namespace ns="http://www.w3.org/1999/xhtml"> <validate schema="../wxs/xhtml11/xhtml11.xsd" useMode="svg"/> </namespace> </mode> <mode name="svg"> <namespace ns="http://www.w3.org/1999/xhtml"> <attach/> </namespace> <namespace ns="http://www.w3.org/2000/svg"> <unwrap/> <validate schema="svg/svg11.rng" useMode="xhtml"/> </namespace> </mode> </rules>
NVDL schéma pak způsobí provedení následujících dvou dílčí validací.
Fragment 1 --> xhtml.xsd: <html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg"> <head> <title>Ukázka SVG obrázku</title> </head> <body> <h1>Vektorový obrázek v SVG</h1> <p>ahoj</p> <!-- Připojená XHTML sekce --> </body> </html> Fragment 2 --> svg.rng: <svg:svg width="4in" height="3in"> <svg:g> <svg:circle style="fill: yellow; stroke: red" cx="200" cy="200" r="150"/> <svg:text x="80" y="200" style="font-size: 36px; font-family: Verdana; color: red; fill: red" >Dobrou chuť</svg:text> </svg:g> </svg:svg>
Zatím jsme viděli, že NVDL umožňuje kombinování elementů řídit
pomocí jmenných prostorů. Chceme-li mít nad vzájemných kombinováním
dokumentů lepší kontrolu, můžeme použít element
context
. Ten dovoluje specifikovat konkrétní element,
uvnitř něhož jsou dovoleny elementy z jiných jmenných prostorů.
Následující příklad ukazuje schéma pro XHTML+RDF, kdy RDF
metadata se mohou vyskytovat pouze v záhlaví dokument (element
head
).
n
v
d
l<rules xmlns="http://purl.oclc.org/dsdl/nvdl/ns/structure/1.0" startMode="root"> <mode name="root"> <namespace ns="http://www.w3.org/1999/xhtml"> <validate schema="xhtml.rng"> <context path="head" useMode="rdf"/> </validate> </namespace> </mode> <mode name="rdf"> <namespace ns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <validate schema="rdf.rng" useMode="attach"/> </namespace> </mode> <mode name="attach"> <anyNamespace> <attach/> </anyNamespace> </mode> </rules>
I když jsme si popsali jen část možností celého jazyka NVDL, je zřejmé, že se jedná o velice silný nástroj. I přes jeho poměrně mladý věk již existuje řada standardů nebo jejich návrhů, které NVDL používají. Jedná se například o jazyky SVG 1.2, Office Open XML, DocBook, ITS nebo UBL.
V současné době existují tři implementace jazyka NVDL, všechny z nich jsou open-source. Jedná se o implementace JNVDL a oNVDL v jazyce Java a enovdl pro platformu Mono/.NET.
[6] Nespokojíme se tedy s tím, že konkrétně Schematron lze vkládat přímo do schématu v RELAX NG nebo W3C XML schéma.