RELAX NG
RELAX NG （リラクシング、RELAX Next Generation） は、マークアップ言語XMLのスキーマ言語の一つである。RELAX NG で記述されたスキーマは、XML文書の構造と内容のパターンを定義する。RELAX NG で記述されたスキーマは、それ自身がXML文書である。RELAX NG でスキーマをXML文書として記述する方法を、XML構文という。しかし RELAX NG では、スキーマをXML構文ではない簡潔な短縮構文 (Compact Syntax) で記述することもできる。つまり RELAX NG では、XML構文でスキーマを記述しても良いし、短縮構文でスキーマを記述しても良い。RELAX NG は、W3C XML Schema と比べて仕様が簡潔である。RELAX NG は、ジェームズ・クラークと村田真が共同で設計した。2001年12月に、OASISの RELAX NG 技術委員会が、RELAX NG の仕様を標準として策定した。2003年に、ISO/IEC 19757-2 (文書スキーマ定義言語 第2部 正規文法に基づく妥当性検証) として策定された。
背景
マークアップ言語 SGML から使われてきたスキーマ言語であった DTD は、XMLで使う際には、XMLの構文規則を満たしていないなど、様々な問題を有していた。そのため、W3C によって XML Schema が開発されたが、標準化に時間がかかり、また標準化のために巨大化・複雑化しすぎたとの批判から、独自にスキーマ言語を開発する動きが出た。
村田真などの人々は、 Regular Language description for XML (RELAX) を開発した。ジェームズ・クラークは、TREX (Tree Regular Expressions for XML) を開発した。クラークと村田は、RELAX NG を、TREX と RELAX Core に基づいて、この2つのスキーマ言語を統合する形で設計した。
RELAX NG で記述されたスキーマを使う例
一冊の書籍 (book) を記述するための簡単なXML文書のためのスキーマを定義することを、考える。一冊の書籍は、一つもしくは複数の (one or more) ページ (page) の並びとして定義される。おのおののページは、テキスト (text) のみを含む。一冊の書籍を記述するXML文書インスタンスの例を次に示す。
<?xml version="1.0" encoding="UTF-8"?><book>
  <page>これは1ページです。</page>
  <page>これは2ページです。</page></book>
XML構文
RELAX NG を使ったスキーマは、他の要素の定義を含めたルート要素を定義することにより、入れ子構造で記述することができる。要素の定義自身に、パターンの定義を埋め込むことができる。この方法を使って、書籍のXML文書のスキーマをXML構文で次のように記述することができる。
<element name="book" xmlns="http://relaxng.org/ns/structure/1.0">
   <oneOrMore>
      <element name="page">
         <text/>
      </element>
   </oneOrMore></element>
入れ子構造では、深い階層構造をもつXML文書については扱いにくく、また再帰的な要素を定義することはできない。このため、RELAX NGを使った多くのスキーマでは「名前付パターン」定義への参照を使う。名前付パターンの定義は、スキーマ内で名前付パターンへの参照とは分離して記述される。次に示す「フラットなスキーマ」では、先述のスキーマの例と全く同じマークアップを正確に定義する。
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
   <start>
      <element name="book">
         <oneOrMore>
            <ref name="page"/>
         </oneOrMore>
      </element>
   </start>
   <define name="page">
      <element name="page">
         <text/>
      </element>
   </define></grammar>
短縮構文
RELAX NG 短縮構文は、XMLに準拠しない形式である。短縮構文は、同等なXML構文のスキーマに正確に変換することが可能であり、また逆にXML構文のスキーマから同等な短縮構文のスキーマに正確に変換することが可能である。つまりXML構文と短縮構文は、構造および意味的に一対一に対応している。これは、Simple Outline XML (SOX; en:Simple Outline XML) とXMLの関係と同様である。短縮構文は、DTDの構文と多くの機能を共有している。以下に入れ子構造の短縮構文によるスキーマの例を示す。
element book{
    element page { text }+
}
また上記のスキーマは、名前付パターンを使って以下のようにも定義できる。

start = element book { page+ }
page = element page { text }
これらふたつのスキーマは意味的に同等である。
ファイル名の接尾辞 (拡張子)
非公式的な慣習として、RELAX NG のXML構文で記述されたスキーマは、ファイルの名称の接尾辞 (拡張子) として ".rng" が使われている。短縮構文のスキーマのファイル名の接尾辞は、".rnc" が使われている。