Hlavní navigace

Úskalí XML (4)

Petr Cimprich 31. 1. 2003

W3C XML Schema 1.0 je zatím nejobsáhlejší specifikací z oblasti XML. Autoři se pravděpodobně snažili vtěsnat do WXS veškeré funkce, které pokládali za užitečné. Výsledkem je málo srozumitelný standard, jehož všechny aspekty ovládá a v praxi využije málokdo. Přesto se WXS krok za krokem prosazuje.

W3C XML Schema

Přes rozpačité přijetí si WXS pomalu získává pozici důležitého standardu mezi jazyky pro popis schémat dokumentů XML a stále více uživatelů si s ním musí poradit. Velká část z nich volí praktický přístup. Namísto teoretického studia všech jemných detailů se omezují na ovládnutí a používání základních funkcí vhodných pro jejich účely. Všem, kdo mají s WXS co do činění, se může hodit upozornění na některá úskalí, na něž mohou při práci s WXS narazit.

Každé schéma může obsahovat lokální a globální deklarace elementů. Zatímco globální elementy patří do cílového jmenného prostoru schématu, lokální nemají standardně žádný jmenný prostor.

<xs:schema xmlns:xs="http://www.w3c.org/2001/XMLSchema"
  targetNamespace="http://gingerall.org/ns">

  <!-- globální deklarace elementu-->
  <xs:element name="root">
    <xs:complexType>

      <xs:sequence>
        <!-- lokální deklarace elementu-->
        <xs:element name="node" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element name="root">

</xs:schema>

Elementy node z tohoto příkladu nepatří do cílového jmenného prostoru. Stejný přístup, jaký u atributů příhodně rozlišuje příslušnost k oddílům v rámci jmenného prostoru, u elementů působí problematicky. Chceme-li, aby i lokální elementy spadaly do cílového jmenného prostoru, je třeba si to explicitně vynutit pomocí atributu elementFormDefault. Pokud nemáte vážný důvod postupovat jinak, měl by být tento atribut vždy nastaven na hodnotu „qualified“.

<xs:schema xmlns:xs="http://www.w3c.org/2001/XMLSchema"
  targetNamespace="http://gingerall.org/ns"
  elementFormDefault="qualified">

Některé podmínky (např. xs:key, xs:keyref nebo xs:unique) lze ve schématech WXS vyjádřit pomocí selektorů XPath. Při jejich psaní by měly být správně použity prefixy a jmenné prostory. Autor schématu se musí orientovat v tom, které deklarované elementy patří do cílového jmenného prostoru a které nikoliv, a nesmí zapomenout, že defaultní jmenný prostor se ve výrazech XPath neuplatňuje.

Schéma se může obejít i bez cílového jmenného prostoru. Pokud takové schéma zahrneme do jiného schématu s cílovým jmenným prostotem, platí tento jmenný prostor i pro elementy a atributy zahrnutého schématu. Obsahuje-li však původní schéma selektory XPath, nový cílový jmenný prostor se na ně nemusí uplatnit a podmínky mohou ztratit svůj smysl. Používat selektory XPath v dílčích schématech určených k zahrnutí do cílového jmenného prostoru je tudíž krajně neprozíravé.

WXS dovoluje specifikovat předvolené hodnoty elementů a atributů. Je na uvážení každého autora schématu, zda opravdu chce, aby jeho dokumenty byly bez schématu neúplné a po validaci obsahovaly jiné informace než před validací. Pokud už implicitní hodnoty použijete, neměla by jimi být kvalifikovaná jména. Nikde totiž není přesně specifikováno, co se má stát, pokud je pro URI jmenného prostoru kvalifikovaného jména ve validovaném dokumentu deklarován jiný prefix než ve schématu, případně není deklarován žádný.

<!-- schéma -->
<xs:schema xmlns:xs="http://www.w3c.org/2001/XMLSchema"
  xmlns:p1="http://foo"
  targetNamespace="http://gingerall.org/ns">

  <xs:element name="node" type="xs:QName" default="p1:value"/>

  [...]

</xs:schema>

<!-- dokument -->
<root xmlns:p2="http://foo">
  <node/>
</root>

Má být dokument po validaci doplněn na <node>p1:valu­e</node>nebo <node>p2:valu­e</node>? Jediná správná a logická odpověď neexistuje. Implementace WXS se budou s velkou pravděpodobností v řešení těchto nepřehledných situací rozcházet. Implicitním hodnotám v podobě kvalifikovaného jména je rozhodně lepší se vyhnout.

Další často zmiňovanou slabinou WXS je restrikce složených typů. Restrikce umožňuje odvodit ze základního typu nový typ, jehož rozsah možných hodnot je podmnožinou rozsahu základního typu. Komplexní typy se deklarují výčtem; restrikce komplexního typu pak obsahuje výčet omezení oproti původnímu typu. Při každé změně definice základního typu je proto nutné zkontrolovat a případně upravit všechny restrikce tohoto typu. Tento princip neškáluje. Údržba rozsáhlých schémat s dlouhými řetězci typů odvozených restrikcí se může snadno stát noční můrou. Krom toho jsou restrikce samy o sobě poměrně složité a je velmi pravděpodobné, že někde uděláme chybu, případně že náš procesor WXS obsahuje v této oblasti chybu. Kdo může, udělá lépe, když restrikce ve svém schématu vynechá.

Podobně je jistější obejít se i bez ostatních pokročilých funkcí WXS, jako jsou například abstraktní typy nebo redefinice typů. Stručný průvodce obezřetného uživatele jazyka WXS by mohl vypadat třeba takto: Vytvářejte přehledná schémata omezená na základní funkce (lokální a globální elementy a atributy, jednoduché typy, anonymní a pojmenované komplexní typy). Udržujte schémata co nejlépe čitelná lidským okem. Ověřujte validaci proti schématu s více procesory WXS. Nepovažujte WXS za jediný validační jazyk; možná se pro vaše účely lépe hodí jiný, např. RelaxNG nebo Schematron.

Našli jste v článku chybu?

6. 2. 2003 10:53

Petr Cimprich (neregistrovaný)

XML-QL se zda byt trochu na vedlejsi koleji, nejvic se o nem mluvilo nekdy v roce 1998/99. W3C se XML-QL nechalo inspirovat pro svuj podobny jazyk XQuery.

Pokud vim, existuje implementace v Jave od autoru XML-QL (http://www.research.att.com/sw/tools/xmlql/).
Nove implementace XML-QL bych necekal, ani ta stavajici nevypada moc zive. V praxi bych asi spis zvazil prechod na XQuery.




4. 2. 2003 12:44

ondra (neregistrovaný)

zdarek, nevite nekdo o pouziti xml-ql v praxi? nejaky parsery a tak... syntaxe je na netu dost, ale prakticky pouziti jsem nenasel.
diky ondra


Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

Podnikatel.cz: Udávání kvůli EET začalo

Udávání kvůli EET začalo

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Root.cz: Telegram spustil anonymní blog Telegraph

Telegram spustil anonymní blog Telegraph

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi

Podnikatel.cz: Babiše přesvědčila 89letá podnikatelka?!

Babiše přesvědčila 89letá podnikatelka?!

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU

Měšec.cz: mBank cenzuruje, zrušila mFórum

mBank cenzuruje, zrušila mFórum

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Měšec.cz: Golfové pojištění: kde si jej můžete sjednat?

Golfové pojištění: kde si jej můžete sjednat?

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Vitalia.cz: 9 největších mýtů o mase

9 největších mýtů o mase

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu