Schematron: validace XML pomocí pravidel

Schematron kontroluje tvrzení nad XML pomocí dotazů, obvykle XPath. Vedle XSD nebo RELAX NG ověří vztahy mezi hodnotami a pravidla konkrétního použití.

Autor: Aktualizováno

Pravidlo místo seznamu elementů

XSD může vyžadovat číslo; Schematron může vyžadovat, aby splatnost nebyla před vystavením nebo součet odpovídal položkám. Pravidlo se vyhodnocuje v uzlech určených context. Assert uspěje, když test vrátí true; report naopak hlásí splněnou podmínku.

Funkční příklad

Toto schéma používá základní vazbu xslt a XPath 1.0. Faktura musí mít alespoň jednu položku a celkem musí odpovídat součtu atributů cena. Výpočet je výukový: pro peníze v produkci použij definovaná desetinná a zaokrouhlovací pravidla.

Funkční příklad
<schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt">
  <pattern id="castky"><rule context="faktura">
    <assert test="count(polozka) &gt; 0">Chybí položky.</assert>
    <assert test="number(@celkem) = sum(polozka/@cena)">Nesouhlasí součet.</assert>
  </rule></pattern>
</schema>

Výsledek a procesor

Procesor pravidla přeloží nebo interpretuje; často vytváří výsledky v XML formátu SVRL. U neúspěšných kontrol si přečti místo chyby a její vysvětlení. Samotný XML parser schéma nespustí a náš XSD/RELAX NG validátor Schematron neprovádí. Jednotlivé testy si můžeš ověřit v XPath testeru.

Výsledek a procesor
<faktura celkem="150"><polozka cena="100"/><polozka cena="50"/></faktura>

Jmenné prostory a verze

Pro dokument v namespace deklaruj prefix přes element ns schématu a používej jej v context i test. Výchozí namespace zdrojového XML nestačí. Aktuální norma je ISO/IEC 19757-3:2025; existující procesory a fakturační sady mohou vyžadovat starší vydání a konkrétní queryBinding. Nepřepínej vazbu na xslt2/xslt3 bez podpory procesoru.

Spuštění základního schématu a čtení SVRL

Kompilace a použití jednoduchého schématu s queryBinding xslt
xsltproc iso_svrl_for_xslt1.xsl faktura.sch > validator.xsl
xsltproc validator.xsl faktura.xml > report.svrl

Ulož schéma z úvodu jako faktura.sch a dokument jako faktura.xml. Pro tento základní příklad použij XSLT 1.0 procesor xsltproc a soubory iso_svrl_for_xslt1.xsl a iso_schematron_skeleton_for_xslt1.xsl ze stejné release/verze ISO Skeleton implementace, ve stejné složce. První příkaz vytvoří validační stylesheet, druhý report. Historická implementace zde demonstruje základní vazbu xslt; není dokladem podpory všech vlastností normy 2025.

U platné faktury se v reportu nevyskytne failed-assert. Změň celkem ze 150 na 151 a znovu spusť druhý příkaz. Výsledek obsahuje neúspěšné tvrzení se zprávou Nesouhlasí součet. Úspěšný návratový kód XSLT transformace sám neznamená úspěšnou obchodní validaci: pro rozhodnutí musíš prohlédnout SVRL.

Ilustrační část SVRL; konkrétní zápis location závisí na procesoru
<svrl:failed-assert xmlns:svrl="http://purl.oclc.org/dsdl/svrl"
 test="number(@celkem) = sum(polozka/@cena)" location="/faktura">
  <svrl:text>Nesouhlasí součet.</svrl:text>
</svrl:failed-assert>

V XPath nad reportem navaž svrl na uvedené URI a hledej //svrl:failed-assert. Report může obsahovat i successful-report; aplikace musí mít dohodnuté závažnosti. Pro schémata používající include či abstract patterns je potřebný další předzpracovací krok; výše uvedené dva příkazy jsou určeny jednoduchému schématu bez těchto konstrukcí.

Pravidla pro dokument se jmenným prostorem

Deklarace prefixu pro dotazy Schematronu
<schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt">
  <ns prefix="f" uri="urn:faktury"/>
  <pattern><rule context="f:faktura">
    <assert test="count(f:polozka) &gt; 0">Faktura nemá položky.</assert>
  </rule></pattern>
</schema>

Pro <faktura xmlns="urn:faktury"> nebude pravidlo s prostým context=faktura odpovídat. To může vést k prázdnému reportu, který se omylem vyhodnotí jako úspěch. Vedle chyb kontroluj, zda se očekávaná pravidla skutečně aktivovala, a testuj alespoň jeden dokument, který je má porušit. XSD ověření namespace a struktury proto nech před Schematronem.