RELAX NG
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を扱う多くのソフトウェアでサポートされるようになっている。DocBook、TEIガイドライン、OpenDocumentのような広く使われている文書指向のマークアップ言語は、RELAX NG を第一のスキーマとして採用している。
RELAX NG と W3C XML Schema は、多くの機能を共有している。この2つの現代的なスキーマ言語は、従来使われてきたDTDとは、多くの面で異なっている。RELAX NG と XML Schema がともにもつ機能としては、次のようなものがある。
ファイル名の接尾辞 (拡張子)
[編集]非公式的な慣習として、RELAX NG のXML構文で記述されたスキーマは、ファイルの名称の接尾辞 (拡張子) として ".rng" が使われている。短縮構文のスキーマのファイル名の接尾辞は、".rnc" が使われている。
妥当性検証器の実装
[編集]RELAX NG の妥当性検証器 (バリデータ) の実装として利用可能なものの一部を示す。いずれもオープンソースのソフトウェアである。
- Jing - ジェームズ・クラーク
- Sun Multi-Schema Validator (MSV) - サン・マイクロシステムズ、川口耕介
- libxml2 - GNOMEプロジェクト
関連項目
[編集]- 生け垣オートマトン
- スキーマ言語
- Document Type Definition (DTD、文書型定義)
- Regular Language description for XML (RELAX)
- TREX (Tree Regular Expressions for XML)
- 文書スキーマ定義言語 (DSDL)
- スキマトロン
- W3C XML Schema
注釈・出典
[編集]- ^ RELAX NG Compact Syntax
- ^ RELAX NG Specification
- ^ RELAX NG Technical Committee
- ^ 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
外部リンク
[編集]- RELAX NG ホームページ
- RELAX NG 仕様書
- RELAX NG 日本語ポータル
- RELAX NG 入門 (XML構文)
- RELAX NG 入門 (短縮構文)
- "The Design of RELAX NG" - ジェームズ・クラーク
- XML文書の構造を設計するためのデザインパターン
- RELAX NG Book - Eric van der Vlist, GNU Free Documentation Licenseのもとで公開
- Relax NG Reference - ZVON
- RELAX NG Java community projects - java.net
妥当性検証器の実装のリンク
[編集]- Jing - ジェームズ・クラーク
- Sun Multi-Schema Validator (MSV) - オープンソース、サン・マイクロシステムズ、川口耕介
- Relax NG Compact Syntax validator -- オープンソースの C プログラム