| ENGLISH | JAPANESE |
$Id: step5.sdoc 1.7 2000/04/14 12:40:02 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/xmlns/relaxCore">
<interface/>
<elementRule role="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/xmlns/relaxCore">
<interface>
<export label="foo"/>
</interface>
<elementRule role="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/xmlns/relaxCore">
<interface>
<export label="foo"/>
</interface>
<elementRule role="foo">
<ref label="bar"/>
</elementRule>
<tag name="foo"/>
<elementRule role="bar" type="emptyString"/>
<tag name="bar"/>
</module>
interfaceが空でない場合前節の例では,参照される側のモジュールのinterface要素は空でした.次のように,interface要素に子要素を追加してみます.
<module
moduleVersion="1.2"
relaxCoreVersion="1.0"
targetNamespace=""
xmlns="http://www.xml.gr.jp/xmlns/relaxCore">
<interface>
<export label="bar"/>
</interface>
<elementRule role="bar" type="emptyString"/>
<tag name="bar"/>
</module>
この場合には,インクルードされる側のモジュールにあるinterface要素の内容が,インクルードする側のモジュールのinterface要素に追加されます.この例では次のようになります.
<module
moduleVersion="1.2"
relaxCoreVersion="1.0"
targetNamespace=""
xmlns="http://www.xml.gr.jp/xmlns/relaxCore">
<interface>
<export label="foo"/>
<export label="bar"/>
</interface>
<elementRule role="foo">
<ref label="bar"/>
</elementRule>
<tag name="foo"/>
<elementRule role="bar" type="emptyString"/>
<tag name="bar"/>
</module>
STEP 5で,大規模なモジュールも管理できるようになりました.RELAX!