RELAX NG: schéma XML v XML i kompaktní syntaxi

RELAX NG popisuje povolenou strukturu XML pomocí vzorů. Hodí se i pro dokumenty se smíšeným obsahem; nabízí XML syntaxi RNG a kompaktní syntaxi RNC.

Autor: Aktualizováno

Nejmenší schéma

Schéma níže požaduje kořen katalog a nejméně jednu knihu. Každá má povinný atribut id a textový název. Jmenný prostor schématu není jmenným prostorem validovaného dokumentu.

Nejmenší schéma
<element xmlns="http://relaxng.org/ns/structure/1.0" name="katalog">
  <oneOrMore><element name="kniha">
    <attribute name="id"><text/></attribute>
    <element name="nazev"><text/></element>
  </element></oneOrMore>
</element>

Dokument a ověření

Ulož schéma do katalog.rng, dokument do katalog.xml. Ve zdejším XML nástroji vyber na záložce Schéma RELAX NG. Nebo použij xmllint --noout --relaxng katalog.rng katalog.xml. Odebrání id má validaci porušit.

Dokument a ověření
<katalog><kniha id="k1"><nazev>XML v praxi</nazev></kniha></katalog>

Skládání vzorů

choice vybírá alternativu, optional dovoluje vynechání, zeroOrMore opakování a interleave prokládání bez pevného pořadí. Pomocí grammar, define a ref znovu použiješ vzor. Datové typy XSD se zapojují přes datatypeLibrary; samotné text nezaručuje číslo.

RNG a RNC

RNC je jiný zápis stejného modelu. Není XML a nelze jej vložit jako RNG do našeho validátoru. Pro převod použij například Trang. RELAX NG nenahrazuje obchodní pravidla typu součet částek; ta doplň Schematronem. Pořadí elementů je významové, pořadí atributů ne.

RNG a RNC
element katalog { element kniha { attribute id { text }, element nazev { text } }+ }

Namespace, datové typy a opakovaně použitý vzor

knihy.rng — kompletní schéma
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
         ns="urn:knihy" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <start><element name="katalog"><oneOrMore><ref name="kniha"/></oneOrMore></element></start>
  <define name="kniha"><element name="kniha">
    <attribute name="id"><data type="token"/></attribute>
    <interleave>
      <element name="nazev"><text/></element>
      <element name="cena"><data type="decimal"><param name="minInclusive">0</param></data></element>
      <optional><element name="poznamka"><text/></element></optional>
    </interleave>
  </element></define>
</grammar>
knihy.xml — cena může být před názvem díky interleave
<katalog xmlns="urn:knihy"><kniha id="k1"><cena>199.50</cena><nazev>XML</nazev></kniha></katalog>

Grammar sdružuje start a pojmenovanou definici. Ref dovoluje tentýž vzor opakovat bez kopírování. ns stanoví prostor elementů validovaného dokumentu, zatímco xmlns patří samotnému RNG. Neprefixovaný atribut id není v prostoru urn:knihy. Datatype library dává hodnotě cena pravidla xs:decimal a ne zápis s exponentem.

Spusť xmllint --noout --relaxng knihy.rng knihy.xml. Při změně ceny na -1 nebo text abc validace selže; po vynechání namespace také. Zaměněné pořadí názvu a ceny projde, protože interleave umožňuje obě pořadí. Optional dovoluje vynechat poznámku, nikoli přidat neznámý element.

Stejný model v kompaktní syntaxi

knihy.rnc — odpovídající compact syntax
default namespace = "urn:knihy"
datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
start = element katalog { kniha+ }
kniha = element kniha {
  attribute id { xsd:token },
  (element nazev { text } &
   element cena { xsd:decimal { minInclusive = "0" } } &
   element poznamka { text }?)
}

Znak & vyjadřuje interleave, čárka pevné pořadí, svislá čára choice, otazník nepovinný vzor a plus jeden či více výskytů. RNC není XML. Pro náš validátor nejdřív vytvoř RNG například příkazem java -jar trang.jar knihy.rnc knihy.rng s knihovnou Trang; compact syntax může přímo zpracovat i Jing podle své konfigurace.

RELAX NG je vhodné pro flexibilní dokumentový model; XSD poskytuje vlastní komponentový a typový systém a často je požadováno obchodním rozhraním. Vyber jazyk schématu podle požadavků příjemce a podpory ve svém validátoru. Součty, vazby na jiný dokument či pravidla obchodu řeš Schematronem nebo aplikací. Základní vzory vysvětluje oficiální tutorial.