「RELAX NG」の版間の差分
Kaizen nagoya (会話 | 投稿記録) 編集の要約なし |
|||
11行目: | 11行目: | ||
一冊の書籍 (book) を記述するための簡単な[[Extensible Markup Language|XML]]文書のためのスキーマを定義することを、考える。一冊の書籍は、一つもしくは複数の (one or more) ページ (page) の並びとして定義される。おのおののページは、テキスト (text) のみを含む。一冊の書籍を記述するXML文書インスタンスの例を次に示す。 |
一冊の書籍 (book) を記述するための簡単な[[Extensible Markup Language|XML]]文書のためのスキーマを定義することを、考える。一冊の書籍は、一つもしくは複数の (one or more) ページ (page) の並びとして定義される。おのおののページは、テキスト (text) のみを含む。一冊の書籍を記述するXML文書インスタンスの例を次に示す。 |
||
< |
<syntaxhighlight lang="xml"> |
||
<?xml version="1.0" encoding="UTF-8"?> |
<?xml version="1.0" encoding="UTF-8"?> |
||
<book> |
<book> |
||
17行目: | 17行目: | ||
<page>これは2ページです。</page> |
<page>これは2ページです。</page> |
||
</book> |
</book> |
||
</syntaxhighlight> |
|||
</source> |
|||
=== XML構文 === |
=== XML構文 === |
||
23行目: | 23行目: | ||
RELAX NG を使ったスキーマは、他の要素の定義を含めたルート要素を定義することにより、[[ネスティング|入れ子構造]]で記述することができる。要素の定義自身に、パターンの定義を埋め込むことができる。この方法を使って、書籍のXML文書のスキーマをXML構文で次のように記述することができる。 |
RELAX NG を使ったスキーマは、他の要素の定義を含めたルート要素を定義することにより、[[ネスティング|入れ子構造]]で記述することができる。要素の定義自身に、パターンの定義を埋め込むことができる。この方法を使って、書籍のXML文書のスキーマをXML構文で次のように記述することができる。 |
||
< |
<syntaxhighlight lang="xml"> |
||
<element name="book" xmlns="http://relaxng.org/ns/structure/1.0"> |
<element name="book" xmlns="http://relaxng.org/ns/structure/1.0"> |
||
<oneOrMore> |
<oneOrMore> |
||
31行目: | 31行目: | ||
</oneOrMore> |
</oneOrMore> |
||
</element> |
</element> |
||
</syntaxhighlight> |
|||
</source> |
|||
入れ子構造では、深い階層構造をもつXML文書については扱いにくく、また[[再帰的]]な要素を定義することはできない。このため、RELAX NGを使った多くのスキーマでは「名前付パターン」定義への参照を使う。名前付パターンの定義は、スキーマ内で名前付パターンへの参照とは分離して記述される。次に示す「フラットなスキーマ」では、先述のスキーマの例と全く同じマークアップを正確に定義する。 |
入れ子構造では、深い階層構造をもつXML文書については扱いにくく、また[[再帰的]]な要素を定義することはできない。このため、RELAX NGを使った多くのスキーマでは「名前付パターン」定義への参照を使う。名前付パターンの定義は、スキーマ内で名前付パターンへの参照とは分離して記述される。次に示す「フラットなスキーマ」では、先述のスキーマの例と全く同じマークアップを正確に定義する。 |
||
< |
<syntaxhighlight lang="xml"> |
||
<grammar xmlns="http://relaxng.org/ns/structure/1.0"> |
<grammar xmlns="http://relaxng.org/ns/structure/1.0"> |
||
<start> |
<start> |
||
50行目: | 50行目: | ||
</define> |
</define> |
||
</grammar> |
</grammar> |
||
</syntaxhighlight> |
|||
</source> |
|||
=== 短縮構文 === |
=== 短縮構文 === |
||
56行目: | 56行目: | ||
RELAX NG 短縮構文は、XMLに準拠しない形式である。短縮構文は、同等なXML構文のスキーマに正確に変換することが可能であり、また逆にXML構文のスキーマから同等な短縮構文のスキーマに正確に変換することが可能である。つまりXML構文と短縮構文は、構造および意味的に一対一に対応している。これは、Simple Outline XML (SOX; [[:en:Simple Outline XML]]) とXMLの関係と同様である。短縮構文は、[[Document Type Definition|DTD]]の構文と多くの機能を共有している。以下に入れ子構造の短縮構文によるスキーマの例を示す。 |
RELAX NG 短縮構文は、XMLに準拠しない形式である。短縮構文は、同等なXML構文のスキーマに正確に変換することが可能であり、また逆にXML構文のスキーマから同等な短縮構文のスキーマに正確に変換することが可能である。つまりXML構文と短縮構文は、構造および意味的に一対一に対応している。これは、Simple Outline XML (SOX; [[:en:Simple Outline XML]]) とXMLの関係と同様である。短縮構文は、[[Document Type Definition|DTD]]の構文と多くの機能を共有している。以下に入れ子構造の短縮構文によるスキーマの例を示す。 |
||
< |
<syntaxhighlight lang="rnc"> |
||
element book |
element book |
||
{ |
{ |
||
element page { text }+ |
element page { text }+ |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
また上記のスキーマは、名前付パターンを使って以下のようにも定義できる。 |
また上記のスキーマは、名前付パターンを使って以下のようにも定義できる。 |
||
< |
<syntaxhighlight lang="rnc"> |
||
start = element book { page+ } |
start = element book { page+ } |
||
page = element page { text } |
page = element page { text } |
||
</syntaxhighlight> |
|||
</source> |
|||
これらふたつのスキーマは意味的に同等である。 |
これらふたつのスキーマは意味的に同等である。 |
2020年7月5日 (日) 22:41時点における版
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 プログラム