Relax NG

RELAX NG () on OASIS-organisaation kehittämä skeemakieli XML-dokumenttien määrittelyyn. Skeemakieli julkaistiin maaliskuussa 2000. RELAX NG:ssä yhdistyivät James Clarkin kehittämä TREX (Tree regular expression for XML) -skeemakieli sekä Murata Makoton kehittämä RELAX (Regular language of description for XML) -skeemakieli.
RELAX NG -skeema on XML-pohjainen rakennemäärittely, mutta siitä on mahdollista käyttää myös kompaktia esitysmuotoa, joka ei pohjaa XML:ään. XML-pohjaisen skeeman tiedostopääte on yleensä *.rng ja kompaktisyntaksin muotoisen skeeman *.rnc
Verrattuna muihin skeemakieliin, kuten esimerkiksi W3C:n XML Schema -skeemakieleen, RELAX NG:n sanotaan olevan suhteellisen yksinkertainen. OpenDocument-toimistodokumentit on kuvattu RELAX NG -skeemakielellä.
XML-pohjainen rakennemäärittely.
RELAX NG –skeema määritellään XML-elementtien joukkona. Oletetaan, että RELAX NG -skeemamme määrittää muistion, jolla on kaksi lapsielementtiä; 'laatija' ja 'paivamaara'. Näin ollen skeema voisi näyttää seuraavanlaiselta:
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;element name =”muistio” xmlns="http://relaxng.org/ns/structure/1.0 "&gt; 
 &lt;element name =”laatija”&gt;
 &lt;text/&gt;
 &lt;/element&gt;
 &lt;element name=”pvm”&gt;
 &lt;text/&gt;
 &lt;/element&gt;
&lt;/element&gt;
Edellä määritelty RELAX NG -skeema alkaa XML-deklaraatiorivillä, jonka jälkeen määritellään juurielementti muistio. Yksittäisen elementin määritykseen käytetään element-elementtiä. muistio-elementin lopettava tunniste, &lt;/element&gt;, on skeeman viimeinen elementti ja näin ollen muut elementtimääritykset kirjoitetaan juurielementin alku- ja lopputunnisteiden väliin. element-elementin esiintyminen ilmaisee itsessään, että elementti on pakollinen. Toisin sanoen, elementin ilmentymisen pakollisuutta ei tarvitse RELAX NG:ssä ilmaista muulla tavoin kuin määrittelemällä elementti skeemaan. Esimerkkiskeemasta huomataan myös, että juurielementtiin tulee lisätä myös elementin konteksti eli käytännössä nimiavaruus osoitteeseen http://relaxng.org/ns/structure/1.0.
Ensimmäinen määriteltävä elementti esimerkissä juurielementin jälkeen on laatija-elementti, joka voi sisältää merkkitietoa. Näin ollen laatija-elementin määrityksessä esiintyy elementti &lt;text/&gt; laatija-elementin alku- ja lopputunnisteiden välissä. Kyseinen elementti siis ilmaisee, että elementillä voi olla tekstimuotoista sisältöä, eli että elementti ei ole tyhjä.
Nimetyt mallineet.
RELAX NG –skeeman elementtimääritykset jaetaan tyypillisesti erillisiin nimettyihin mallineisiin (engl. named pattern), mikäli elementtien määrä on suuri ja määriteltävän dokumenttipuun rakenne hyvin hierarkkinen. Nimetyt mallineet ovat määrittelylohkoja, joista skeema rakentuu. Eli sen sijaan, että elementtien määritykset esiintyisivät skeemassa yhtenä listana siinä järjestyksessä, missä elementtien tulee XML-dokumentissa esiintyä, elementtimäärityksiä voidaan ryhmitellä loogisiin lohkoihin, jotka joko sisältävät elementtimäärityksiä (tai attribuuttimäärityksiä) taikka viittauksia (engl. references) toisiin nimettyihin mallineisiin.
RELAX NG –spesifikaatio ei ota kantaa siihen, millä periaatteella nimettyjä mallineita tulisi määritellä vaan nimettyjen mallineiden käyttö on aina skeemakohtaista ja skeemasuunnittelijoiden päätettävissä. On kuitenkin mielekästä pyrkiä siihen, että skeeman luettavuus säilyy. Näin ollen nimetyt mallineet tulisi nimetä selkeästi ja niiden sisältämät määritykset tulisi laatia mahdollisimman johdonmukaisesti.
Nimettyjen mallineiden käytön kannalta keskeisiä elementtejä ovat define- ja ref-elementit. Nimetyt mallineet aloitetaan aina define-elementillä. Nimensä mukaisesti define-elementillä määritellään nimetty malline. Esimerkki nimetystä mallineesta, jonka nimi on muistio-malline:
&lt;define element =”muistio-malline”&gt;
 &lt;element name =”muistio”&gt;
 &lt;ref name =”laatija-malline”/&gt;
 &lt;ref name =”paivamaara-malline”/&gt;
 &lt;/element&gt;
&lt;/define&gt;
Nimetyt mallineet konstruoidaan siis define-elementtien sisälle. Yllä olevan esimerkin mukaan nimetty muistio-malline sisältää määrityksen elementille 'muistio'. muistio-elementin lapsielementit 'laatija' ja 'paivamaara' on taas määritelty omissa nimetyissä mallineissaan, joihin määrityksessä viitattaan ref-elementein. Kun nimetyt mallineet nimetään selkeästi, skeemasta tulee luettavampi. Tämä tarkoittaa käytännössä sitä, että ref-elementin sisältämä, selkeästi nimetty viittaus mahdollistaa sen, että esimerkiksi skeemasuunnittelija voi helposti päätellä millaisesta määrityksestä on viittaukseen nimetyssä mallineessa kyse.
Attribuuttien määrittely.
Määritellään muistiolle status-attribuutti, jonka arvo ilmaisee muistion tilaa (onko muistio esimerkiksi vielä muokkausvaiheessa vai mahdollisesti valmis). Näin ollen status-attribuutti voitaisiin määritellä esim. seuraavalla tavalla:
&lt;element name=”muistio”&gt;
 &lt;attribute name=”status”&gt;
 &lt;text/&gt;
 &lt;/attribute&gt;
&lt;/element&gt;
Esimerkistä huomataan, että attribuutti voidaan määritellä sen elementin alku- ja loppu-tunnisteiden väliin, jonka attribuutista on kyse. Yllä olevassa esimerkissä status-attribuutti on siis nimen-omaan muistio-elementin attribuutti, sillä attribuutin määritys sijaitsee muistio-elementin alku- ja lopputunnisteiden välissä. Attribuutin oletussisältö on RELAX NG –spesifikaation mukaan aina merkkitietoa, joka ilmenee skeemassa elementtinä &lt;text/&gt;. 
Mikäli status-attribuutti haluttaisiin määritellä valinnaiseksi, tulisi se tehdä optional-elementtien avulla seuraavasti:
&lt;element name=”muistio”&gt;
 &lt;optional&gt;
 &lt;attribute name=”status”&gt;
 &lt;text/&gt;
 &lt;/attribute&gt;
 &lt;/optional&gt;
&lt;/element&gt;