ENGLISHJAPANESE
<< リラックスのしかた/第一部: RELAX Core/STEP 6: デフォルト値,実体,記法 >>

STEP 6: デフォルト値,実体,記法


$Id: step6.sdoc 1.9 2000/11/01 13:45:32 murata Exp $
DTDにある機能のうち,まだ扱っていないのは,デフォルト値,実体,記法です.STEP 6では,これらをどう扱うかを示します.

RELAXで導入しない理由

デフォルト値,実体,記法はRELAXにはありません.これらをRELAXで導入しないのは,既存のXMLパーサを使い続けるためです.
もし,RELAXでこれらの機能を導入したとします.たとえば,default属性をattribute要素に導入して,属性のデフォルトを指定できるようにします.しかし,既存のパーサはXML文書の解析時にRELAXモジュールをいっさい見てくれません.したがって,default属性もとうぜん使いません.実体や記法を宣言するための構文をRELAXに導入しても,やはり同じことです.
これらの機能をRELAXで導入するには,RELAX専用のXMLパーサを新たに作るしか方法はありません.RELAXに基づいてXML文書を作るユーザは,もちろんこのRELAX専用XMLパーサを使う必要があります.それだけでなく,このようにして作成されたXML文書を受け取るユーザにも,RELAX専用XMLパーサに乗り換えてもらうことが必要になります.これはあまり現実的ではありません.

DTDとRELAXの併用

では,デフォルト値,実体,記法はまったく使えないのでしょうか.いいえ,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/xmlns/relaxCore">

  <interface>
    <export label="person"/>
  </interface>

  <elementRule role="person">
    <empty/>
  </elementRule>

  <tag name="person">
    <attribute name="bloodType">
      <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
      moduleVersion="1.0"
      relaxCoreVersion="1.0"
      xmlns="http://www.xml.gr.jp/xmlns/relaxCore">

  <interface>
    <export label="doc"/>
  </interface>

  <elementRule role="doc">
    <ref label="para" occurs="*"/>
  </elementRule>

  <elementRule role="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
      moduleVersion="1.0"
      relaxCoreVersion="1.0"
      xmlns="http://www.xml.gr.jp/xmlns/relaxCore">

  <interface>
    <export label="doc"/>
  </interface>

  <elementRule role="doc" type="emptyString"/>

  <tag name="doc">
    <attribute name="logo" type="ENTITY"/>
  </tag>

</module>

やはり使うべきではない

前節で示したように,DTDとRELAXを併用すれば,デフォルト値,実体,記法を使うことは可能です.しかし,やはり使わないに越したことはありません.
デフォルト値については,アプリケーションプログラムの側で対応することができます.属性が省略されたときの処理として記述すればいいわけです.属性が省略されたとき,あらかじめ決めた値を追加するようなXSLTスクリプトを書くこともできます.
外部解析対象実体と解析対象外実体については,リンクを使いましょう.リンクのほうがWWWにふさわしい方法です.
内部解析対象実体については,使ってかまいません."<"のように,内部解析対象実体(例えば&lt;)を用いて表現するのがもっとも自然なものもあります.
なお,DTDにデフォルト値,実体,記法を記述しても,期待と異なる結果になることがあります.これは,XMLパーサによっては外部DTDサブセットまたは外部パラメタ実体にある宣言を読まないためです.ここで示した例は,すべて内部サブセットで宣言しているので,予想外の結果になることはありません.

まとめ

STEP 6までで,DTDから乗り換えるには十分以上の機能があります.この範囲なら,DTDと相互に変換しても,データ型に関する情報以外は欠落しません.将来,XML Schemaに変換することも容易に可能でしょう.RELAX!

<< リラックスのしかた/第一部: RELAX Core/STEP 6: デフォルト値,実体,記法 >>