この標準情報(TR)は,日本規格協会 情報技術標準化研究センター(INSTAC) に設立された次世代ネットワークの標準化に関する調査研究委員会で,2000年 度に行われた調査研究をもとに,工業標準化の促進に関連して特に重要と判断 される技術情報をまとめ,標準情報(TR)(タイプII)として公表するものである。
RELAX (REgular LAnguage description for XML)は,XMLベースの言語の構文 を記述するための機構を提供する。例えば,XHTML 1.0の構文はRELAX によっ て記述することができる。
同様の機構であるDTDと比較して,RELAXは次の特徴を備えている。
RELAXは,RELAX Core(標準情報(TR) X 0029:2000)及びRELAX Namespaceの 二つの部分からなる。この標準情報(TR)はRELAX Namespaceを規定する。RELAX Coreによる記述は単一の名前空間を扱う。RELAX Namespaceによる記述は, RELAX Coreによる記述をいくつか組み合わせることによって,複数の名前空間 を扱う。一部の名前空間について,RELAX Core以外の言語によって記述する こともできる。
RELAX Namespaceプロセサというソフトウェアモジュールは,一つ以上の名 前空間を含むXML文書を与えられて,RELAX Namespaceによる記述と照合し,結 果を出力する。照合には,別のソフトウェアモジュールである検証プロセサを 起動し,単一名前空間に関する記述と照合することを繰り返す。単一名前空間 に関する記述がRELAX Coreによるものなら,検証プロセサとしてRELAX Coreプ ロセサを用いる。
次に示す規定は,この標準情報(TR)の文中での引用によって, この標準情報 (TR)の規定の一部となる。
TR X 0008:1999 拡張可能なマーク付け言語(XML) 1.0
備考 W3C (World Wide Web Consortium), Extensible Markup Language (XML) 1.0, Recommendation, http://www.w3.org/TR/REC-xml, 1998が[TR X 0008]に一致している。
TR X 0023:1999 XML名前空間
備考 W3C (World Wide Web Consortium), Name Spaces in XML, Recommendation, http://www.w3.org/TR/REC-xml-names, 1999が[TR X 0023]に一致している。
W3C (World Wide Web Consortium), XML Information Set, W3C Working Draft, http://www.w3.org/TR/xml-infoset, 2000
TR X 0029:2000 XML正規言語記述 RELAX コア
備考 ISO/IEC DTR 22250-1:2000, Document Description and Processing Languages -- Regular Language Description for XML (RELAX) -- Part 1: RELAX Core, 2000 Octoberが[TR X 0029]に一致している。
IETF(Internet Engineering Task Force), RFC 2396, Uniform Resource Identifiers (URI): Generic Syntax, 1998
この標準情報(TR)では,[TR X 0008]で定義されている次の用語をそのまま用いる。
この標準情報(TR)では,[TR X 0023]で定義されている次の用語を用いる。
この標準情報(TR)では,XML Information Setで定義されている次の用語を用いる
この標準情報(TR)では,[TR X 0029]で定義されている次の用語を用いる
a) 検証プロセサ
島をモジュールと照合し,合法か非合法かを示すメッセージを出力する ソフトウェアモジュール
備考 RELAX Coreプロセサは,RELAX Coreで書かれ たモジュールのための検証プロセサである。
この標準情報(TR)は,RELAXモジュールの構文を規定するため,DTD記法の一部を用いる。DTDは名前空間を正しく扱えないので,DTDをそのまま採用せずに一部だけを用いる。
要素がどんな内容をもつかを記述するため,内容モデルを採用する。これは,XML 1.0 の非終端記号contentspecにマッチするものとする。
例えば,要素fooが内容をもたないとき,要素fooの内容を次のとおりに記述する。
EMPTY
要素がどんな属性をもつかを記述するため,属性リスト宣言の一部を採用する。これは,XML 1.0 の非終端記号AttDefにマッチするものとする。
例えば,要素fooが属性barだけをもち,barは省略可能で,barの値は任意の文字列のとき,要素fooの属性定義を次のとおりに記述する。
bar CDATA #IMPLIED
RELAX Namespaceの設計原則を次に示す。
備考 異なるマークアップ言語の類似性を表現するた めの機構として,JIS X 4155が体系形式(architectural form)を提供している。
XML文書を表す文書情報項目であって,この標準情報(TR)が規定する制約条 件を満たしているものをRELAX文法と言う。RELAX文法には,次の二種類の情報 を記述する。
名前空間名及びモジュールの対は,ある名前空間に属する要素がどのモジュー ルに照らして合法であるかを示す。一つの文法はこのような対を一つ以上含む。 一つの文法に含まれる二つ以上の対が,同一の名前空間名を指定することはな い。
モジュールは,RELAX文法を表現するXML文書の一部に含めることができる。 また,RELAX文法からモジュールとして他のXML文書を参照することもできる。
モジュールは,RELAX Coreで書くことができる。また,RELAX Core以外の 言語で書くこともできる。
トップレベルの要素に関する制約条件は,インスタンスのトップレベルと してどんな要素が出現できるかを規定する。この制約条件が指定されない 場合には,インスタンスのトップレベルに関する制約はない。
インスタンス及びRELAX文法を与えられて,インスタンスをいくつかの島に 分割し,島及びモジュールに対して検証プロセサを呼び出すソフトウェアモジュー ルをRELAX Namespaceプロセサと言う。モジュールがRELAX Coreで書かれてい るときは、検証プロセサとしてRELAX Coreプロセサを呼び出す。モジュールが RELAX Core 以外の言語で書かれているときは、その言語のための検証プロセ サを呼び出す。検証プロセサ,XMLプロセサ及びアプリケーションプログラム の関係を図1に示す。
図1. RELAX Coreプロセサ,XMLプロセサ及びアプリケーションプログラムの関係
RELAX Namespaceプロセサは,文書に含まれる名前空間のうちRELAX文法で 記述されているものに対して検証プロセサを呼び出すことができる。ま た、ユーザが検証するように指定した名前空間に対してだけ検証プロセサを呼 び出すこともできる。検証する名前空間を記述するモジュールは必ず読み込む が,検証されない名前空間を記述するモジュールを読み込む必要はな い。
ある島及びモジュールに対して呼び出された検証プロセサは,その島が合 法であるかどうかを示すメッセージを出力する。RELAX Namespaceプロセサは, インスタンス全体が合法であるかどうかを示すメッセージを出力する。これ以 外にも,RELAX Namespaceプロセサは幾つかのメッセージを出力する。
RELAX Namespaceプロセサはメッセージ以外の何も出力しない。アプリケーショ ンプログラムは,XMLプロセサが出力する情報セット,RELAX Namespaceプロセ サ及び検証プロセサが出力するメッセージだけを受け取って処理を行う。
RELAX Namespaceプロセサは,インスタンス及びRELAX文法をXMLプロセサか ら情報セットとして受け取る。RELAX Namespaceプロセサが利用するXMLプロセ サは,妥当性を検証するプロセサであっても,妥当性を検証しないプロセサで あっても構わない。
参考 現実の実装では,SAX, DOMなどのAPIを通じて情報項目が渡される。
文法を構成するすべての要素は,名前空間 http://www.xml.gr.jp/xmlns/relaxNamespaceに属する。
文法全体を表す要素としてgrammarを導入する。grammar要素は,文法全体についての管理情報を表す。
grammar要素は,grammarVersion属性,relaxNamespaceVersion属性をもつ。 relaxNamespaceVersion属性は,必須とする。
grammarVersion CDATA #IMPLIED relaxNamespaceVersion CDATA #REQUIRED
grammarVersion属性は,この要素が表す文法の版数を示す。
relaxNamespaceVersion属性は,RELAX Namespaceの版数を示す。RELAX Namespace 1.0 に適合することを示すためには,版数"1.0" を使用しなければ ならない。ある文法が,RELAX Namespace 1.0に適合しないとき,値 "1.0"を使用するのはエラーとする。
参考 RELAX Namespaceの今後の版に"1.0"以外の値を 付与することが,この標準情報(TR)の原案作成委員会の意図であるが, RELAX Namespaceの将来の版を作成することを確約するわけではなく,作成 したとしても版数指定について,特定の方法を使用することを確約するわけ でもない。将来の版を作成する可能性があるので,必要な場合に自動的な版 の認識を可能とするため,この属性を提供する。
ユーザが適切なオプションを指定した場合,RELAX Namespaceプロセサは, サポートしていない版数のついたモジュールを受け取っときメッセージを出力 しなければならない。その後,RELAX Namespaceプロセサは処理を続行しても よく,中止してもよい。
grammar要素の内容は,次の内容モデルによって規定される。パラメタ実体 annotationInGrammarは,http://www.xml.gr.jp/xmlns/relaxNamespace以外の 名前空間の要素だけが出現する限り,どのように定義しても構わない。
(%annotationInGrammar; (namespace | include)*, (topLevel, (namespace | include)*)?)
namespace要素は,名前空間名とモジュールを記述する。モジュールは, namespace要素の子要素として記述することもでき,namespace要素から URIによって参照することもできる。
namespace要素は,name属性,moduleLocation属性,language属性,及び validation属性をもつ。
name CDATA #REQUIRED moduleLocation CDATA #IMPLIED language CDATA #IMPLIED validation (false) #IMPLIED
name属性は,名前空間名を指定する。空の文字列が属性値として指定され たとき,このモジュールはデフォルトの名前空間に属する。
備考 [TR X 0023]では,空の文字列はどの名前空間 にも属していないことを表すが,この標準情報(TR)では,説明を簡単にする ため,デフォルトの名前空間に属しているとみなす。
moduleLocation属性は,モジュールをURI reference[IETF RFC 2396]によっ て参照する。URI referenceは,断片識別子(fragment identifier)を含んでい てはならない。namespace要素がモジュールを子要素としてもつとき, moduleLocation属性を指定してはならない。逆に、モジュールを子要素として もたないとき,moduleLocation属性を指定しなければならない。
namespace要素がモジュールを子要素としてもつ場合,又はmoduleLocation属性 でモジュールを参照する場合にも,RELAX Namespaceプロセサはこれとは異な るモジュールを用いてもよい。モジュールを特定する機構は実装依存とする。
language属性は,このモジュールがどの言語で書かれているかを,その言 語を意味するURIを指定することによって示す。省略されたときは,RELAX Coreで書かれたモジュールであることを意味する。
validation属性は,この名前空間を検証対象とするかどうかを示す。 "false"が値として指定されれば検証対象にはならない。
namespace要素の子要素として、RELAX Core のモジュールや他の言語のモ ジュールを含めることができる。namespace要素が複数の子要素をもつときは, 最後の子要素をモジュールとみなす。namespace要素の子孫要素は,名前空 間http://www.xml.gr.jp/xmlns/relaxNamespaceに属してはならない。
例1: RELAX Coreモジュールを直接書いたもの
<namespace name="http://www.foo.co.jp"> <module xmlns="http://www.xml.gr.jp/xmlns/relaxCore" relaxCoreVersion="1.0"> <elementRule role="foo" type="emptyString"/> <tag name="foo"/> </module> </namespace>
例2: 直接書いたRELAX Coreモジュールから他のRELAX Coreモジュールをinclude によって参照したもの
<namespace name="http://www.foo.co.jp"> <module xmlns="http://www.xml.gr.jp/xmlns/relaxCore" relaxCoreVersion="1.0"> <hedgeRule label="foo"> <empty/> </hedgeRule> <include moduleLocation="foo.rxm"/> </module> </namespace>
例3: RELAX CoreモジュールをURIで参照したもの
<namespace name="http://www.foo.co.jp" moduleLocation="foo.rxm"/>
例4: RELAX Core以外の言語で書かれたモジュールをURIで参照したもの
<namespace name="http://www.foo.co.jp" language="http://www.thaiopensource.com/trex" moduleLocation="foo.trex"/>
例5: RELAX Coreで書かれたモジュールに対して検証しないことを指定したもの
<namespace name="http://www.foo.co.jp" validation="false"/>
topLevel要素は,インスタンス全体のトップレベルとなる要素情報項目に関する制約を 表現する。
文法の中にtopLevel要素が出現しないときは,文書全体のトップレベルと なる要素に関する制約は存在しない。
topLevel要素は,属性をもたない。
topLevel要素の子要素として,要素情報項目に関する制約を表す要素を含 めることができる。topLevel要素が複数の子要素をもつときは,最後の子要素 が要素情報項目に関する制約を表すとみなす。RELAX Coreを利用するときは, RELAX Coreのref要素またはhedgeRef要素を指定する。topLevel要素の子孫要 素は,名前空間http://www.xml.gr.jp/xmlns/relaxNamespaceに属してはなら ない。
例1: 名前空間http://www.foo.co.jpのラベルfooを参照するref要素を指定したもの
<topLevel> <ref xmlns="http://www.xml.gr.jp/xmlns/relaxCore"> namespace="http://www.foo.co.jp" label="foo"/> </topLevel>
他の文法を参照するための機構として,include要素を導入する。
include要素は,grammarLocation属性を必ずもつ。
grammarLocation CDATA #REQUIRED
grammarLocation属性は,他の文法をURI reference[IETF RFC 2396]によっ て参照する。URI referenceは, 断片識別子(fragment identifier)を含んでは ならない。
include要素の子孫要素は名前空間 http://www.xml.gr.jp/xmlns/relaxNamespaceに属してはならない。
7.は,複数の名前空間をもつ文書の合法性を定義する。まず,文書から島 への分割を定義し,つぎに島ごとの合法性及び文書全体としての合法性を定義 する。
一つのインスタンスに属する要素情報項目eとその親要素情報項目 e' とが異なる名前空間に属し,どちらの名前空間も文法で記述されて いるとき,eをe'から切り離す。切り離し可能なすべての要素 を親要素から切り離すことによって、インスタンスをいくつかの島に分割する.
e' にはe の代わりにdummy要素情報項目を挿入する。dummy要 素情報項目は名前空間http://www.xml.gr.jp/xmlns/dummyに属し, namespaceNameを名前とする属性情報項目をもつ。属性値は,eが属 する名前空間名とする。
備考 例として,二つの名前空間urn:aと urn:bをもつインスタンスを示す。名前空間修飾子ではなく,名前 空間名が重要であることを示すため,タグ名ではなく名前空間名と局所名の対 を用いる。
<{urn:a}foo> <{urn:b}foo> <{urn:a}foo/> <{urn:b}foo/> </{urn:b}foo> <{urn:b}bar> <{urn:b}foo/> </{urn:b}bar> <{urn:a}foo/> </{urn:a}foo>
このインスタンスは,四つの島に分割される。 一つ目の島は,文書全体のトップレベルにあり,名前空間urn:aに属する。
<{urn:a}foo> <dummy namespaceName="urn:b" xmlns="http://www.xml.gr.jp/xmlns/dummy"/> <dummy namespaceName="urn:b" xmlns="http://www.xml.gr.jp/xmlns/dummy"/> <{urn:a}foo/> </{urn:a}foo>
二つ目の島は,名前空間urn:bに属する。
<{urn:b}foo> <dummy namespaceName="urn:a" xmlns="http://www.xml.gr.jp/xmlns/dummy"/> <{urn:b}foo/> </{urn:b}foo>
三つ目の島は,名前空間urn:bに属する。
<{urn:b}bar> <{urn:b}foo/> </{urn:b}bar>
四つ目の島は,名前空間urn:aに属する。
<{urn:a}foo/>
ある島があるモジュールに照らして合法であるとは,つぎの条件を満たす ようにラベルと役割を要素情報項目に付与できるときとする。
<choice occurs="*"> <ref label="l1"/> <ref label="l2"/> ... <ref label="li"/> <hedgeRef label="l'1"/> <hedgeRef label="l'2"/> ... <hedgeRef label="l'j"/> </choice>
あるインスタンスがある文法に照らして合法であるとは,以下の条件を 満たすときとする。
RELAX Namespaceプロセサは,RELAX Coreで書かれたモジュールのみを含む 文法を受け取ったなら,RELAX Coreプロセサを呼び出すことによって島の合法 性を正しく検証し,インスタンスの合法性を検証しなければならない。
validation="false" が指定された名前空間に属する島の合法性を検証してし まう実装であっても,この標準情報(TR)に適合する。
RELAX Core以外の言語で書かれたモジュールを含む文法を受け取ったなら, RELAX Namespaceプロセサは処理を中止してもよく,RELAX Coreプロセサ以外 の検証プロセサを呼び出して島の合法性を検証してもよい。