XHTMLのDTDの読み方のまとめ
XHTMLのDTDを読み方についていろいろ調べたので、ざっくりとですがメモとして残しておきます。
DTDって何?
まずDTDって何?という話から。以下、Wikipeiaからの引用です。
Document Type Definition(文書型定義、DTD)とは、SGML や XML において、文書構造(文書型)を定義するためのスキーマ言語の一つである。 DTD では、SGML や XML の文書内に記述することができる要素やその発生順序、発生回数、要素がもつ属性、属性の型などを、記述することができる。
噛み砕いていうと、XML(SGML)文章の説明書のようなものです。このXML文章では、このタグが使えますよ~。このタグにはこの属性が使えますよ~。とかをそれはもう、こと細かに書いてあります。
XMLは言語を定義することができる言語です。XHTMLはXMLで定義された言語ですよね。何かを定義するからには、どう定義したのかを記す必要があります。その定義を記してあるのがDTDです。
XHTML1.0のDTD
XHTML1.0のDTDは下記の3種類があります。
- XHTML 1.0 Strict
- XHTML 1.0 Transitional
- XHTML 1.0 Frameset
詳細は以下。
DTDの基本
んでは、主題のDTDの読み方について。基本的にDTDに書いてあるのは以下の3つだけです。この3つがわかってれば大体読めると思います。DTDってそんな難しいものじゃないです。
- ENTINY(実体宣言)
- ELEMENT(要素)
- ATTLIST(属性)
ENTINY(実体宣言)
「&
」で「>」を表示するという定義も、この実体参照で宣言しますが、XHTMLのDTDを読むのに必要なのは主に「パラメータ実体」と呼ばれるものです。
パラメータ実体とは
パラメータ実体とは、DTDの文書内でよく使う要素などを別名で宣言することです。
<!ENTITY % 実体名 "置換文字列">
このように宣言すると「%実体名」で「置換文字列」を参照することができます。
パラメーター実体の一例
<!ENTITY % heading "h1|h2|h3|h4|h5|h6">
このように定義することで「%heading;」と書くと、この文章中で「h1|h2|h3|h4|h5|h6
」と同じ意味になります。パラメータ実体でグループ化することで、文章が煩雑になるのを防いだりします。
ELEMENT(要素)
XHTML内で使用できる要素を定義します。定義した要素内に含まれていい要素などもここで定義します。また、要素の定義において下記のような表記をします。正規表現とか知ってる人は理解が楽だと思います。
要素定義で使われる表記
- (foo)+
- 要素fooが1回以上出現する
- (foo)?
- 要素fooが現れないか、1回出現
- (foo)*
- 要素fooが現れないか、任意回数出現
- (foo | var)
- 要素fooもしくは要素varのいずれか一方
- (foo , var)
- 要素foo及びvarがこの順序で出現
- EMPTY
- 内容を持ってはならない
- #PCDATA
- 文字列
要素定義の例
まずは簡単な例から。下記はul要素の定義を記した部分です。
<!ELEMENT ul (li)+>
これを日本語にすると「ul要素の内容は、li要素のみで構成され、li要素が一回以上出現しないといけない」という意味になります。「+」は1回以上出現するという意味ですね。
下記はpタグの定義を示したものです。
<!ELEMENT p %Inline;>
一見単純そうですが、実は結構入り組んだことになっています。%Inline;というはパラメータ実体で下記のように宣言されています。
<!ENTITY % Inline "(#PCDATA | %inline; | %misc.inline;)*">
パラメータ実体の中にさらにパラメータ実体で表記されていますね。さらに「%inline;」を見るとまたパラメータ実体で書かれていて・・・ということになっています。これを全部パラメータ実体からもとの表記に戻してみたのが下記です。
<!ELEMENT p (#PCDATA | a | br | span | bdo | map | object | img | tt | i | b | big | small | em | strong | dfn | code | q | samp | kbd | var | cite | abbr | acronym | sub | sup | input | select | textarea | label | button | ins | del | script)*>
はい。こんな長くなります。これを日本語にすると、「p要素の内容は、文字列、a、br、span(以下略)要素のどれかが0個以上含まれる」という意味です。「*」なので0個以上含まれるです。XHTMLの書籍などを見ると「p要素にはインライン要素のみ含むことが可能」というように書いてあると思いますが、含まれていい要素というのは実際、このようにDTDに詳細に記載されているんですね。
ATTLIST(属性)
要素に付けることのできる属性を定義します。属性の定義の仕方は下記です。
<!ATTLIST 要素名 属性名 データ型 省略可/不可の表記>
要素名はulやpなどの要素名のことです。属性名はidやclassなどの属性名のことですね。データ型と省略可/不可の表記に関しては、XHTMLで使用されるものを以下に示します。
データ型
データ型は属性の値のデータ型を定義します。指定できるものは下記のようなものがあります。
- CDATA
- 任意の文字列。
- ID
- 一意な識別子
- IDREF
- ほかの個所でID型の値として指定された名前を参照する
- IDREFS
- IDREFをリストして記述することを許す
- NMTOKEN
- 名前として使用できる文字を記述するためのデータ型
- 候補オプション
- パイプ区切りで属性値として指定できる値セットを定義する。例えば、(a|b|c)のように記述する
省略可/不可の表記
省略可/不可の表記は読んで字の如くです。その属性が省略可か、不可かを定義します。また、省略した際のデフォルト値なども指定できます。
- #REQUIRED
- 省略不可
- #IMPLIED
- 省略可
- 値
- 省略可。省略した場合は指定した値が適用される
- #FIXED 値
- 省略不可で、必ず指定した値を指定しなければならない
属性定義の例
属性を定義するときは、下記のように要素名を一つだけ書いて、属性名、データ型、省略可/不可の表記を連続して書きます。改行区切りで見やすく表記されています。
<!ATTLIST button
%attrs;
%focus;
name CDATA #IMPLIED
value CDATA #IMPLIED
type (button|submit|reset) "submit"
disabled (disabled) #IMPLIED
>
まとめ
一つに属性についてDTDを頼りに調べようと思うと、パラメーター実体ばかりで、展開するのが面倒です。でもまぁ、それさえやってしまえばDTDを読むのは全然難しくないと思います。
「これってXHTMLの文法的にどうなんだっけ?」というときにはWebサイトや書籍で調べるのもいいですが、やはり正確な情報はDTDから得るべきであると思います。
参考
- Prev Entry:table構造を明確にする属性
- Next Entry:hasLayoutプロパティがtrueで発生するバグ