DTD (Document Type Definition)

$Date: 2002/12/21 22:13:01 $

はじめに

DTD ってなに?

DTD とは文書型定義のことである. 文書中における要素, 属性, その他のデータがどのように定義され, 論理的に関連付けられるかを表す規則を定義する.

XML はメタ言語であり, ユーザが自分の文書のためのマークアップを定義し, 書式化する自由を与えることがその特徴である. したがって, 自分で定義したもの以外は 正しい タグは存在しないという事実を認識することが重要である.

知っておいてほしいこと

parse
構文解析をすること. つまり, 指定されたファイルの内容を検査し, 情報を適切に分類することである.
埋め込み
スタイルシートやスクリプトと同様に, DTD も文書中に埋め込むことができる. 単一の文書中に情報を構造定義を詰め込むことができるので, それ自身で利用する場合はよいが, DTD を再利用することを考えるのなら避けた方がいいかも知れない.
名前空間
各 XML 要素の一意性を保証するために導入されたもの. これの利用は必須ではないが, あると便利. <名前空間:タグ> のように表現する.
DOCTYPE 宣言
XML 宣言の後に続くべきもの. 文書のルート要素を定義し, また DTD を指定する. 現在 2 種類ほど指定の仕方がある;
SYSTEM 指定
<!DOCTYPE ルート要素 SYSTEM "DTD の URI">
PUBLIC 指定
<!DOCTYPE ルート要素 PUBLIC "識別子" "DTD の URI">
PCDATA
Parsed Character Data (解析済み文字データ) の略. 他の要素のタグ, 文字 `<' と `&', シーケンス `]]>' を除く, すべての文字を許容する.
CDATA セクション
シーケンス `<![CDATA[' ではじまり, `]]>' で終る領域. この中では XML プロセッサは文字データをマークアップがあっても解釈しない. すべて単なるテキストとして扱う.

DTD の書き方

要素

要素の宣言の仕方は次の通り;

<!ELEMENT 要素名 規則>

開始文字は `_' ないし XML 1.0 にて Letter として定義されたもの. 2 文字目以降には, XML 1,0 にて NameChar として定義されたもの (文字, 数字, `-', `.', `_') を利用する. ただし, `xml' 始まるシーケンスは使えない.

規則は以下のようなものがある;

ANY
その要素の中に他のタグや, 一般的な文字データを含ませることができる.
(#PCDATA)
一般的な文字データ.
(a, b)
列挙. 要素が特定の順序で現れるようにする場合.
(a|b)
要素 a または b のどちらかが現れるようにする場合.
いずれか一方の要素を含めなければならないのであって, 両方含めると妥当な文書ではなくなることに注意.
EMPTY
空要素.

これらを組み合わせて要素が子を持つように定義したり, グループ化して自由度を高める. また, 対象要素 (ないし対象グループ) の直後に以下の文字を付加することで繰り返しの概念を持たせることができる.

?
0 回または 1 回現れる.
+
1 回以上現れる.
*
0 回以上現れる.

属性

属性の宣言の仕方は次の通り;

<!ATTLIST 対象要素名 属性名 属性タイプ デフォルト値>

属性タイプ:

CDATA
文字データ.
ENTITY
DTD 内で宣言されている実体.
ID
一意の要素識別子.
NMTOKENS
XML の名前トークン.

デフォルト値:

#REQUIRED
要素が出現する時に必ず属性値の指定させる.
#IMPLIED
属性値は文書中の値にまかせる.
#FIXED "値"
属性値は固定で, 変更不可.
"値"
属性のデフォルト値

実体

おおむねマクロのようなものと考えて差し支えない.

一般実体
<!ENTITY 実体名 "置換すべき文字(列)">
参照する時は,
&実体名;
とする.
パラメータ実体
DTD の中でのみ使用され, DTD 内の実体定義により置き換えられる.
<!ENTITY % 実体名 "置換すべき文字(列)">
なお, パラメータ実体を参照する前にあらかじめ定義しておく必要がある.
外部実体
<!ENTITY 実体名 SYSTEM "外部の置換すべきもの">
置換すべきものは URI で与えられ, 参照した XML 文書内に include される.

ちなみに, XML では <, >, &, ' そして " は一般実体として定義されている.


サンプル

DTD

<?xml version="1.0"?>

<!ENTITY % id           "(uid, gid)">

<!ELEMENT passwd     (user+)>
<!ELEMENT user               (name, password, %id;, class?, change?, expire?, gecos, home_dir, shell)>
<!ELEMENT name          (#PCDATA)>
<!ELEMENT password      (#PCDATA)>
<!ELEMENT uid           (#PCDATA)>
<!ELEMENT gid           (#PCDATA)>
<!ELEMENT class         (#PCDATA)>
<!ELEMENT change        (#PCDATA)>
<!ELEMENT expire        (#PCDATA)>
<!ELEMENT gecos         (#PCDATA)>
<!ELEMENT home_dir      (#PCDATA)>
<!ELEMENT shell         (#PCDATA)>

XML 文書

<?xml version="1.0"?>
<?xml-stylesheet href="passwd.css" type="text/css"?>
<!DOCTYPE passwd SYSTEM "passwd.dtd">
<passwd>
 <user>
  <name>karl</name>
  <password>*</password>
  <uid>1000</uid>
  <gid>200</gid>
  <gecos>Michio Jinbo</gecos>
  <home_dir>/home/karl</home_dir>
  <shell>/bin/tcsh</shell>
 </user>
 <user>
  <name>5hed</name>
  <password>*</password>
  <uid>1001</uid>
  <gid>200</gid>
  <gecos>YOSHIDA Ken-ichi</gecos>
  <home_dir>/home/5hed</home_dir>
  <shell>/usr/local/bin/bash</shell>
 </user>
 ...
</passwd>

XML スタイルシート

user                             { display: block;  }
name, password, uid, gid, class,
change, expire, home_dir, shell  { display: inline; }

レンダリング結果

passwd.xml のレンダリング結果


参考

XML デスクトップリファレンス 第 2 版
著: Robert Eckstein, Michel Casabianca, 監訳: 川俣 晶, 訳: 木田 直子, http://www.oreilly.co.jp/BOOK/xmldkr2/
文書型定義(DTD)とその設計
檜山 正幸, http://www.saiensu.co.jp/ct_resource/199809/On-DTD.htm
XML 日本語プロファイル TR X 0015:1999
日本規格協会
tdtd -- Emacs Major Mode for SGML and XML DTDs
Tony Graham, http://www.menteith.com/tdtd/
psgml -- An Emacs mode for SGML and XML
Lennart Staflin, http://sourceforge.net/projects/psgml/

Copyright (C) 2001-2003 Hideyuki KURASHINA. <kura@nisoc.or.jp>