Lably
Skip to content

RELAX NG

  • 4 min read
  • 5 chapters

Related on Lably

Through Computing and Data type

It was defined by a committee specification of the OASIS RELAX NG technical committee in 2001 and 2002, based on Murata Makoto's RELAX and James Clark's TREX, and also by part two of the international standard ISO/IEC 19757: Document Schema Definition Languages (DSDL). ISO/IEC 19757-2 was developed by ISO/IEC JTC 1/SC 34 and published in its first version in 2003.

Schema examples

Suppose we want to define an extremely simple XML markup scheme for a book: a book is defined as a sequence of one or more pages; each page contains text only. A sample XML document instance might be:

<span id="mwKw"></span><span class="nt" id="mwLA"><book></span> <span class="w" id="mwLQ"> </span><span class="nt" id="mwLg"><page></span>This<span class="w" id="mwLw"> </span>is<span class="w" id="mwMA"> </span>page<span class="w" id="mwMQ"> </span>one.<span class="nt" id="mwMg"></page></span> <span class="w" id="mwMw"> </span><span class="nt" id="mwNA"><page></span>This<span class="w" id="mwNQ"> </span>is<span class="w" id="mwNg"> </span>page<span class="w" id="mwNw"> </span>two.<span class="nt" id="mwOA"></page></span> <span class="nt" id="mwOQ"></book></span>

XML syntax

A RELAX NG schema can be written in a nested structure by defining a root element that contains further element definitions, which may themselves contain embedded definitions. A schema for our book in this style, using the full XML syntax, would be written:

<span id="mwPg"></span><span class="nt" id="mwPw"><element</span><span class="w" id="mwQA"> </span><span class="na" id="mwQQ">name=</span><span class="s" id="mwQg">"book"</span><span class="w" id="mwQw"> </span><span class="na" id="mwRA">xmlns=</span><span class="s" id="mwRQ">"http://relaxng.org/ns/structure/1.0"</span><span class="nt" id="mwRg">></span> <span class="w" id="mwRw"> </span><span class="nt" id="mwSA"><oneOrMore></span> <span class="w" id="mwSQ"> </span><span class="nt" id="mwSg"><element</span><span class="w" id="mwSw"> </span><span class="na" id="mwTA">name=</span><span class="s" id="mwTQ">"page"</span><span class="nt" id="mwTg">></span> <span class="w" id="mwTw"> </span><span class="nt" id="mwUA"><text/></span> <span class="w" id="mwUQ"> </span><span class="nt" id="mwUg"></element></span> <span class="w" id="mwUw"> </span><span class="nt" id="mwVA"></oneOrMore></span> <span class="nt" id="mwVQ"></element></span>

Nested structure becomes unwieldy with many sublevels and cannot define recursive elements, so most complex RELAX NG schemas use references to named pattern definitions located separately in the schema. Here, a "flattened schema" defines precisely the same book markup as the previous example:

<span id="mwWg"></span><span class="nt" id="mwWw"><grammar</span><span class="w" id="mwXA"> </span><span class="na" id="mwXQ">xmlns=</span><span class="s" id="mwXg">"http://relaxng.org/ns/structure/1.0"</span><span class="nt" id="mwXw">></span> <span class="w" id="mwYA"> </span><span class="nt" id="mwYQ"><start></span> <span class="w" id="mwYg"> </span><span class="nt" id="mwYw"><element</span><span class="w" id="mwZA"> </span><span class="na" id="mwZQ">name=</span><span class="s" id="mwZg">"book"</span><span class="nt" id="mwZw">></span> <span class="w" id="mwaA"> </span><span class="nt" id="mwaQ"><oneOrMore></span> <span class="w" id="mwag"> </span><span class="nt" id="mwaw"><ref</span><span class="w" id="mwbA"> </span><span class="na" id="mwbQ">name=</span><span class="s" id="mwbg">"page"</span><span class="nt" id="mwbw">/></span> <span class="w" id="mwcA"> </span><span class="nt" id="mwcQ"></oneOrMore></span> <span class="w" id="mwcg"> </span><span class="nt" id="mwcw"></element></span> <span class="w" id="mwdA"> </span><span class="nt" id="mwdQ"></start></span> <span class="w" id="mwdg"> </span><span class="nt" id="mwdw"><define</span><span class="w" id="mweA"> </span><span class="na" id="mweQ">name=</span><span class="s" id="mweg">"page"</span><span class="nt" id="mwew">></span> <span class="w" id="mwfA"> </span><span class="nt" id="mwfQ"><element</span><span class="w" id="mwfg"> </span><span class="na" id="mwfw">name=</span><span class="s" id="mwgA">"page"</span><span class="nt" id="mwgQ">></span> <span class="w" id="mwgg"> </span><span class="nt" id="mwgw"><text/></span> <span class="w" id="mwhA"> </span><span class="nt" id="mwhQ"></element></span> <span class="w" id="mwhg"> </span><span class="nt" id="mwhw"></define></span> <span class="nt" id="mwiA"></grammar></span>

Compact syntax

RELAX NG compact syntax is a non-XML format inspired by extended Backus–Naur form and regular expressions, designed so that it can be unambiguously translated to its XML counterpart, and back again, with one-to-one correspondence in structure and meaning, in much the same way that Simple Outline XML (SOX) relates to XML. It shares many features with the syntax of DTDs. Here is the compact form of the above schema:

<span id="mwkg"></span><span class="kd" id="mwkw">element</span><span class="nv" id="mwlA"> book </span><span class="p" id="mwlQ">{</span> <span class="kd" id="mwlg">element</span><span class="nv" id="mwlw"> page </span><span class="p" id="mwmA">{</span> <span class="kt" id="mwmQ">text</span> <span class="p" id="mwmg">}</span>+ <span class="p" id="mwmw">}</span>

With named patterns, this can be flattened to:

<span id="mwnw"></span>start <span class="o" id="mwoA">=</span> <span class="kd" id="mwoQ">element</span><span class="nv" id="mwog"> book </span><span class="p" id="mwow">{</span> page+ <span class="p" id="mwpA">}</span> page <span class="o" id="mwpQ">=</span> <span class="kd" id="mwpg">element</span><span class="nv" id="mwpw"> page </span><span class="p" id="mwqA">{</span> <span class="kt" id="mwqQ">text</span> <span class="p" id="mwqg">}</span>

A compact RELAX NG parser will treat these two as the same pattern.

Sign in to keep reading

4 more chapters are free with a Lably account.

More in Computing and communication