DTDの基礎

はじめに

DTDはDocument Type Definitionのこと。 その目的はXML文書の合法的な仕組みを定義することである。 DTDはXML文書の中か外部参照で宣言できる。

内部DOCTYPE宣言

DTDがXMLソースファイルの中に含まれるなら、次のような構文法で DOCTYPE定義の中に包むべきである。
<!DOCTYPE root-element [element-declarations]>
下記の例は外部にDTD文書を持つXML文書である。
<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend</body>
</note>
この文書の中で、!DOCTYPE noteはtypeがnoteであることを定義する。 !ELEMENT noteは4つの要素(to, from, heading, body) を持つnote要素であることを定義する。 !ELEMENT toはtypeが#PCDATAである要素であると定義する。 !ELEMENT fromも同様に定義する。

外部DOCTYPE宣言

DTDがXMLソースファイルの外にあるなら、次のような構文法で DOCTYPE定義の中に包むべきである。
<!DOCTYPE root-element SYSTEM "filename">
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note> 
note.dtdファイルの中身は次のようである。
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

なぜDTDを使うのか?

DTDーXMLの建築物

XMLとHTML文書の主要な建築物は..にような要素によって タグされている。

XML文書の建築物

DTDの視点から見ると、すべてのXML文書とHTML文書は次のような 簡単な建築物からできている。

要素

要素はXMLとHTML文書の両方の主要な建築物である。

タグ

タグはマークアップ要素に使われる。のような開始タグは 要素のはじまりをマークアップし、のような終了タグは 要素の終了をマークアップする。

属性

属性は要素についての余分な情報を用意する。属性は常に要素の開始タグの 中に置かれる。次の"img"要素はソースファイルについての追加情報を 持つ。
<img src="computer.gif" />

エンティティー

エンティティーは共通のテキストを定義するために使われる変数である。 最も良く知られたHTMLエンティティー参照は "&nbsp;"である。 このno-breaking-spaceエンティティーは文書の中に余分な余白を挿入するために HTMLの中で使われる。エンティティーは文章がXMLパーサによって翻訳される時 展開される。次のようなエンティティーはXMLで予め定義されている。
エンティティー参照 文字
&lt; <
&gt; >
&amp; &
&quot; "
&apos; '
 

PCDATA

PCDATAは翻訳されるべき文字データであることを意味する。 XML要素の開始と終了のタグにあるテキストが文字データである。 PCDATAはパーサによって翻訳されるであろうテキストである。

CDATA

CDATAは文字データであるが、パーサによって翻訳されるテキストではない。

DTD要素

要素の宣言

DTDにおいて、XML要素は要素宣言で宣言される。要素宣言は下記のような 構文法を持つ。
<!ELEMENT element-name category>
or
<!ELEMENT element-name (element-content)>

空要素

空要素はカテゴリーキーワードEMPTYで宣言される。 table border="1" width="100%" bgcolor="#EFE7D6">
<!ELEMENT element-name EMPTY>

DTD example:
<!ELEMENT br EMPTY>
XML example:
<br />

文字データを持つ要素

文字データだけの要素は#PCDATAで宣言される。
<!ELEMENT element-name (#PCDATA)>

example:
<!ELEMENT note (#PCDATA)>
#PCDATAはパーサによって翻訳される文字データである。もし、#PCDATA節が 要素を含むなら、これらの要素は宣言されなければならない。

任意の内容を持つ要素

カテゴリーキーワードANYで宣言された要素は翻訳可能なデータのいかなる組合せ をも含むことができる。
<!ELEMENT element-name ANY>
example:
<!ELEMENT note ANY>

子供(順序)を持つ要素

1つ以上の子供を持つ要素は子供要素の名前で宣言される。
<!ELEMENT element-name 
 (child-element-name)>
or
<!ELEMENT element-name 
 (child-element-name,child-element-name,.....)>
example:
<!ELEMENT note (to,from,heading,body)>
子供がコンマで分離された順序で宣言されたとき、子供はその文書の中で、 同じ順序で現われなければならない。ノート文書のフル宣言は次のようです。
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to      (#PCDATA)>
<!ELEMENT from    (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body    (#PCDATA)>

同じ要素で1回のみ現われることを宣言する

<!ELEMENT element-name (child-name)>
example:
<!ELEMENT note (message)>
上記の例は子供要素であるmessageがnote要素の中にただ一度だけ現われることが できることを宣言している。

同じ要素で最低1回以上現われることを宣言する

<!ELEMENT element-name (child-name+)>
example:
<!ELEMENT note (message+)>
上記の例に現われる+は子供要素であるmessageがノート要素の中に 1回以上現われなければならないことを宣言している。

同じ要素でゼロかそれ以上現われることを宣言する

<!ELEMENT element-name (child-name*)>
example:
<!ELEMENT note (message*)>
上記の例に現われる*は子供要素であるmessageがnote要素の中でゼロかそれ以上 現われることができることを宣言する。

either/or内容の宣言

example:
<!ELEMENT note (to,from,header,message|body)>
上記の例は要素noteが1つのto要素, 1つのfrom要素、1つのheader要素と 1つのmessage要素か1つのbody要素を含まなければならないと宣言する。

混合内容の宣言

example:
<!ELEMENT note (#PCDATA|to|from|header|message)*>
上記の例はパーサによって翻訳できるデータ、あるいはto, from, header, message要素のあらゆる数を含むことができることを宣言する。

DTD属性

DTDの中で、属性はATTLIST宣言で宣言できる。

属性の宣言

属性宣言はつぎのような構文法を持つ。
<!ATTLIST element-name attribute-name 
 attribute-type default-value>
example:
DTD example:
<!ATTLIST payment type CDATA "check">

XML example:
<payment type="check">
attribute-typeは次のような値を持つことができる。
Value Explanation

CDATA

The value is character data

(en1|en2|..)

The value must be one from an enumerated list

ID

The value is a unique id

IDREF

The value is the id of another element

IDREFS

The value is a list of other ids

NMTOKEN

The value is a valid XML name

NMTOKENS

The value is a list of valid XML names

ENTITY

The value is an entity

ENTITIES

The value is a list of entities

NOTATION

The value is a name of a notation

xml:

The value is a predefined xml value

default-valueは次の値を持つことができる。
Value Explanation

value

The attributes default value

#DEFAULT value

The attributes default value

#REQUIRED

The attribute value must be included in the element

#IMPLIED

The attribute does not have to be included

#FIXED value

The attribute value is fixed

属性宣言の例

DTD example:
<!ELEMENT square EMPTY>
  <!ATTLIST square width CDATA "0">

XML example:
<square width="100"></square>
上記の例で、要素squareはtype CDATAのwidth属性を持つ空要素であると 宣言されている。もしwidth属性が与えられなかったら、 そのwidth属性はゼロのデフォルト値を持つ。

デフォルト属性値

Syntax:
<!ATTLIST element-name attribute-name
 attribute-type "default-value">

DTD example:
<!ATTLIST payment type CDATA "check">

XML example:
<payment type="check">
1つの属性のデフォルト値が指定される時、XML文書の著者が その属性を含まなかった場合でさえも、その属性にある値が 与えられることを前提とする。

implied属性

Syntax:
<!ATTLIST element-name attribute-name 
 attribute-type #IMPLIED>
DTD example:
<!ATTLIST contact fax CDATA #IMPLIED>

XML example:
<contact fax="555-667788">
もしあなたが著者に属性を含むことを強いることを好まなかったら、 implied属性を使いなさい。そして、あなたはデフォルト値の ためのオプションを持たないようにすることだ。

Required属性

Syntax:
<!ATTLIST element-name attribute_name 
 attribute-type #REQUIRED>
DTD example:
<!ATTLIST person number CDATA #REQUIRED>

XML example:
<person number="5677">
もしデフォルト値のオプションを持たないならば、required属性を 使え。しかし、属性があることを強いることになる。

Fixed属性値

Syntax:
<!ATTLIST element-name attribute-name 
 attribute-type #FIXED "value">
DTD example:
<!ATTLIST sender company CDATA #FIXED "Microsoft">


XML example:
<sender company="Microsoft">
もし著者に属性の変更を許さず固定した値を持ちたいなら、 fixed属性値を使え。もし著者が異なった値を含むなら、 XMLパーザがエラーを返すだろう。

Enumerated属性値

Syntax:
<!ATTLIST element-name 
 attribute-name (en1|en2|..) default-value>
DTD example:
<!ATTLIST payment type (check|cash) "cash">

XML example:
<payment type="check">
or
<payment type="cash">
もし合法的な値のセットの1つにしたいなら、enumerated属性値を使いなさい。

DTDエンティティー

エンティティーは共通テキストに対して省略を定義するために使われる。

内部エンティティー宣言

Syntax: 
<!ENTITY entity-name "entity-value">

DTD Example:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">
XML example:
<author>&writer;&copyright;</author>
 

外部エンティティー宣言

Syntax: 
<!ENTITY entity-name SYSTEM "URI/URL">

DTD Example:
<!ENTITY writer    
 SYSTEM "http://www.w3schools.com/entities/entities.xml">
<!ENTITY copyright 
 SYSTEM "http://www.w3schools.com/entities/entities.dtd">
XML example:
<author>&writer;&copyright;</author>