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

$Id: step6.html 1.4 2000/02/24 11:15:13 murata Exp $

text by 村田 真

html by 難波 亮丞


DTDにある機能のうち,まだ扱っていないのは,デフォ ルト値、実体、記法です。STEP 6では、これらをどう扱うかを示します。

1. RELAXで導入しない理由

デフォルト値、実体、記法はRELAXにはありません。これらをRELAXで導入 しないのは、既存のXMLパーサを使い続けるためです。

もし、RELAXでこれらの機能を導入したとします。たとえば、 default属性をattribute要素に導入して、属性のデフォルトを 指定できるようにします。しかし、既存のパーサはXML文書の解析時にRELAXモ ジュールをいっさい見てくれません。したがって、default属性もとうぜん使 いません。実体や記法を宣言するための構文をRELAXに導入しても、やはり同 じことです。

これらの機能をRELAXで導入するには、RELAX 専用のXMLパーサを新たに作 るしか方法はありません。RELAXに基づいてXML文書を作るユーザは,もちろん このRELAX専用XMLパーサを使う必要があります.それだけでなく,このように して作成されたXML文書を受け取るユーザにも、RELAX専用XMLパーサに乗り換 えてもらうことが必要になります。これはあまり現実的ではありません。

2. 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/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>

3. やはり使うべきではない

前節で示したように、DTDとRELAXを併用すれば、デフォルト値、実体、記 法を使うことは可能です。しかし、やはり使わないに越したことはありません。

デフォルト値については、アプリケーションプログラムの側で対応するこ とができます。属性が省略されたときの処理として記述すればいいわけです。 属性が省略されたとき、あらかじめ決めた値を追加するようなXSLTスクリプト を書くこともできます。

外部解析対象実体と解析対象外実体については、リンクを使いましょう。 リンクのほうがWWWにふさわしい方法です。

内部解析対象実体については、使ってかまいません。"<"のように、内 部解析対象実体(例えば&lt;)を用いて表現するのがもっとも自然なものも あります。

なお、DTDにデフォルト値、実体、記法を記述しても、期待と異なる結果に なることがあります。これは、XMLパーサによっては外部DTDサブセットまたは 外部パラメタ実体にある宣言を読まないためです。ここで示した例は、すべて 内部サブセットで宣言しているので、予想外の結果になることはありません。

4. まとめ

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

mura034@attglobal.net

Valid HTML 4.0!