$Id: step5.html 1.6 2000/02/24 11:35:46 murata Exp $
大きすぎるモジュールは管理するのが大変です。STEP 5は、モジュールを いくつかのファイルに分割して管理するための機能を説明します。
200の要素型をもつDTDでRELAXで表現すると仮定します。なお、この程度の 大きさのDTDはいくつも存在します。RELAXでは、各要素型ごとにelementRule とtagがそれぞれ必要とします。一つが平均3行としても1200行になります。 文書化を積極的に行えば3000行ぐらいの長さになることも 考えられます。これは、一つのファイルに格納するにはいささか長すぎます。
DTDのときは、外部パラメタ実体を用いて、大規模なDTDを分割して管理し ていました。RELAXでも、大規模なモジュールを分割するための機構が必要に なります。
include要素RELAXでは、他のモジュールをinclude要素によって参照する
ことができます。include要素は参照されたモジュールの本体に
よって置き換えられます。
include要素の使用例を考えてみます。まず、インクルード
される側のモジュールをつぎに示します。
<module
moduleVersion="1.2"
relaxCoreVersion="1.0"
targetNamespace=""
xmlns="http://www.xml.gr.jp/2000/relaxCore">
<elementRule pred="bar" type="emptyString"/>
<tag name="bar"/>
</module>
このモジュールには、barに関する
elementRuleとtag要素があります。
interface要素は空要素です。このモジュールは
bar.rlxに格納されているものとします。
次に、このモジュールを参照して取り込む側のモジュールを示します。
<module
moduleVersion="1.2"
relaxCoreVersion="1.0"
targetNamespace=""
xmlns="http://www.xml.gr.jp/2000/relaxCore">
<interface>
<export labels="foo"/>
</interface>
<elementRule pred="foo">
<ref label="bar"/>
</elementRule>
<tag name="foo"/>
<include moduleLocation="bar.rlx" />
</module>
このモジュールには,fooに関する
elementRuleとtagが記述されています.モジュー
ルの最後にあるinclude要素は,moduleLocation
属性でbar.rlxを指定しています。
include要素は,参照されているモジュールの本体
(module要素の内容のうち,interface以降)に
よって置き換えられます.この例では,つぎのように置き換えられます.
<module
moduleVersion="1.2"
relaxCoreVersion="1.0"
targetNamespace=""
xmlns="http://www.xml.gr.jp/2000/relaxCore">
<interface>
<export labels="foo"/>
</interface>
<elementRule pred="foo">
<ref label="bar"/>
</elementRule>
<tag name="foo"/>
<elementRule pred="bar" type="emptyString"/>
<tag name="bar"/>
</module>
interfaceが空でない場合前節の例では,参照される側のモジュールのinterface要素は
空でした.次のように,interface要素に子要素を追加してみま
す.
<module
moduleVersion="1.2"
relaxCoreVersion="1.0"
targetNamespace=""
xmlns="http://www.xml.gr.jp/2000/relaxCore">
<interface>
<export labels="bar"/>
</interface>
<elementRule pred="bar" type="emptyString"/>
<tag name="bar"/>
</module>
この場合には,インクルードされる側のモジュールにある
interface要素の内容が,インクルードする側のモジュールの
interface要素に追加されます.この例では次のようになります.
<module
moduleVersion="1.2"
relaxCoreVersion="1.0"
targetNamespace=""
xmlns="http://www.xml.gr.jp/2000/relaxCore">
<interface>
<export labels="foo"/>
<export labels="bar"/>
</interface>
<elementRule pred="foo">
<ref label="bar"/>
</elementRule>
<tag name="foo"/>
<elementRule pred="bar" type="emptyString"/>
<tag name="bar"/>
</module>
STEP 5で,大規模なモジュールも管理できるようになりました。RELAX!
mura034@attglobal.net