$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