$Id: step6.html 1.4 2000/02/24 11:15:13 murata Exp $
DTDにある機能のうち,まだ扱っていないのは,デフォ ルト値、実体、記法です。STEP 6では、これらをどう扱うかを示します。
デフォルト値、実体、記法はRELAXにはありません。これらをRELAXで導入 しないのは、既存のXMLパーサを使い続けるためです。
もし、RELAXでこれらの機能を導入したとします。たとえば、
default属性をattribute要素に導入して、属性のデフォルトを
指定できるようにします。しかし、既存のパーサはXML文書の解析時にRELAXモ
ジュールをいっさい見てくれません。したがって、default属性もとうぜん使
いません。実体や記法を宣言するための構文をRELAXに導入しても、やはり同
じことです。
これらの機能をRELAXで導入するには、RELAX 専用のXMLパーサを新たに作 るしか方法はありません。RELAXに基づいてXML文書を作るユーザは,もちろん このRELAX専用XMLパーサを使う必要があります.それだけでなく,このように して作成されたXML文書を受け取るユーザにも、RELAX専用XMLパーサに乗り換 えてもらうことが必要になります。これはあまり現実的ではありません。
では、デフォルト値、実体、記法はまったく使えないのでしょうか。 いいえ、RELAXとDTDを併用すれば、これらの機能を使うことができます。
以下に、DTDを持つXML文書を示します。
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE person [ <!ATTLIST person bloodtype CDATA "A"> ]> <person/>
この文書と照合するRELAXモジュールを示します。
<module
moduleVersion="1.0"
relaxCoreVersion="1.0"
xmlns="http://www.xml.gr.jp/2000/relaxCore">
<interface>
<export labels="person"/>
</interface>
<elementRule pred="person">
<empty/>
</elementRule>
<tag name="person">
<attribute name="type">
<enumeration value="O"/>
<enumeration value="A"/>
<enumeration value="B"/>
<enumeration value="AB"/>
</attribute>
</tag>
</module>
この例では、DTDの側でデフォルト値"A"を指定しています。XMLパーサは、 これを利用してくれます。RELAXモジュールに照らしてこのXML文書を検証する ことも問題なく可能です。"A"が属性値として指定された場合とまったく同様 にして検証は行われます.
同様に、実体や記法もDTDで記述することができます。まず、 解析対象実体の例を示します。
<?xml version="1.0"?> <!DOCTYPE doc [ <!ENTITY foo "This is a pen"> ]> <doc> <para>&foo;</para> </doc>
この文書は、次のRELAXモジュールに従っています。
<module
version="1.0"
relaxVersion="1.0"
xmlns="http://www.xml.gr.jp/relax">
<interface>
<export labels="doc"/>
</interface>
<elementRule pred="doc">
<ref label="para" occurs="*"/>
</elementRule>
<elementRule pred="para" type="string"/>
<tag name="doc"/>
<tag name="para"/>
</module>
つぎに、解析対象外実体と記法を用いた例を示します。
<?xml version="1.0"?> <!DOCTYPE doc [ <!NOTATION eps PUBLIC "-//ISBN 0-7923-9432-1::Graphic Notation//NOTATION Adobe Systems Encapsulated Postscript//EN"> <!ENTITY logo_eps SYSTEM "logo.eps" NDATA eps> <!ELEMENT doc EMPTY> <!ATTLIST doc logo ENTITY #IMPLIED> ]> <doc logo="logo_eps"/>
この文書も、次のRELAXモジュールに従っています。
<module
version="1.0"
relaxVersion="1.0"
xmlns="http://www.xml.gr.jp/relax">
<interface>
<export labels="doc"/>
</interface>
<elementRule pred="doc" type="emptyString"/>
<tag name="doc">
<attribute name="logo" type="ENTITY"/>
</tag>
</module>
前節で示したように、DTDとRELAXを併用すれば、デフォルト値、実体、記 法を使うことは可能です。しかし、やはり使わないに越したことはありません。
デフォルト値については、アプリケーションプログラムの側で対応するこ とができます。属性が省略されたときの処理として記述すればいいわけです。 属性が省略されたとき、あらかじめ決めた値を追加するようなXSLTスクリプト を書くこともできます。
外部解析対象実体と解析対象外実体については、リンクを使いましょう。 リンクのほうがWWWにふさわしい方法です。
内部解析対象実体については、使ってかまいません。"<"のように、内 部解析対象実体(例えば<)を用いて表現するのがもっとも自然なものも あります。
なお、DTDにデフォルト値、実体、記法を記述しても、期待と異なる結果に なることがあります。これは、XMLパーサによっては外部DTDサブセットまたは 外部パラメタ実体にある宣言を読まないためです。ここで示した例は、すべて 内部サブセットで宣言しているので、予想外の結果になることはありません。
STEP 6までで、DTDから乗り換えるには十分以上の機能があります。この範 囲なら、DTDと相互に変換しても、データ型に関する情報以外は欠落しません。 将来、XML Schemaに変換することも容易に可能でしょう。RELAX!
mura034@attglobal.net