この標準情報(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に属する。
フレームワーク全体を表す要素としてframeworkを導入する。framework要素は,フレームワーク全体についての管理情報を表す。
framework要素は,frameworkVersion属性,relaxNamespaceVersion属性をもつ。 relaxNamespaceVersion属性は,必須とする。
frameworkVersion CDATA #IMPLIED relaxNamespaceVersion CDATA #REQUIRED
frameworkVersion属性は,この要素が表すフレームワークの版数を示す。
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プロセサは処理を続行してもよく,中止してもよい。
framework要素の内容は,次の内容モデルによって規定される。パラメタ実体 annotationInFrameworkは,http://www.xml.gr.jp/xmlns/relaxNamespace以外の名前空間の要素だけが出現する限り,どのように定義しても構わない。
(%annotationInFramework; (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要素は,frameworkLocation属性を必ずもつ。
frameworkLocation CDATA #REQUIRED
frameworkLocation属性は,他のフレームワークを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プロセサ以外の検証プロセサを呼び出して島の合法性を検証してもよい。