RELAX NG (リラクシング、RELAX Next Generation) は、マークアップ言語XMLスキーマ言語の一つである。RELAX NG で記述されたスキーマは、XML文書の構造と内容のパターンを定義する。RELAX NG で記述されたスキーマは、それ自身がXML文書である。RELAX NG でスキーマをXML文書として記述する方法を、XML構文という。しかし RELAX NG では、スキーマをXML構文ではない簡潔な短縮構文 (Compact Syntax) で記述することもできる[1]。つまり RELAX NG では、XML構文でスキーマを記述しても良いし、短縮構文でスキーマを記述しても良い。RELAX NG は、W3C XML Schema と比べて仕様が簡潔である。RELAX NG は、ジェームズ・クラーク村田真が共同で設計した。2001年12月に、OASISの RELAX NG 技術委員会が、RELAX NG の仕様を標準として策定した[2][3]。2003年に、ISO/IEC 19757-2 (文書スキーマ定義言語 第2部 正規文法に基づく妥当性検証) として策定し、2008年に改定している[4]

背景

編集

マークアップ言語 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 }

これらふたつのスキーマは意味的に同等である。

W3C XML Schema との比較

編集

RELAX NG の仕様は、W3C XML Schema の仕様とほぼ同じ時期に設計された。XML Schema が策定された2001年の時点では、RELAX NG よりも XML Schema の方が、より多くの技術者に名前を知られており、より多くのオープンソースおよび商用の妥当性検証器 (バリデータ) やエディタが実装されていた。しかしその後、RELAX NG はこのスキーマ戦争を順調に戦い抜き、XMLを扱う多くのソフトウェアでサポートされるようになっている。DocBookTEIガイドライン、OpenDocumentのような広く使われている文書指向のマークアップ言語は、RELAX NG を第一のスキーマとして採用している。

RELAX NG と W3C XML Schema は、多くの機能を共有している。この2つの現代的なスキーマ言語は、従来使われてきたDTDとは、多くの面で異なっている。RELAX NG と XML Schema がともにもつ機能としては、次のようなものがある。

ファイル名の接尾辞 (拡張子)

編集

非公式的な慣習として、RELAX NG のXML構文で記述されたスキーマは、ファイルの名称の接尾辞 (拡張子) として ".rng" が使われている。短縮構文のスキーマのファイル名の接尾辞は、".rnc" が使われている。

妥当性検証器の実装

編集

RELAX NG の妥当性検証器 (バリデータ) の実装として利用可能なものの一部を示す。いずれもオープンソースソフトウェアである。

関連項目

編集

注釈・出典

編集
  1. ^ RELAX NG Compact Syntax
  2. ^ RELAX NG Specification
  3. ^ RELAX NG Technical Committee
  4. ^ ISO/IEC 19757-2:2008 Information technology - Document Schema Definition Language (DSDL) - Part 2: Regular-grammar-based validation - RELAX NG https://www.iso.org/standard/52348.html

外部リンク

編集

妥当性検証器の実装のリンク

編集