Webtech Walker

XHTMLのDTDの読み方のまとめ

XHTMLのDTDを読み方についていろいろ調べたので、ざっくりとですがメモとして残しておきます。

DTDって何?

まずDTDって何?という話から。以下、Wikipeiaからの引用です。

Document Type Definition(文書型定義、DTD)とは、SGML や XML において、文書構造(文書型)を定義するためのスキーマ言語の一つである。 DTD では、SGML や XML の文書内に記述することができる要素やその発生順序、発生回数、要素がもつ属性、属性の型などを、記述することができる。

Document Type Definition - Wikipedia

噛み砕いていうと、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

詳細は以下。

XHTML 1.0 - DTDs

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から得るべきであると思います。

参考

このエントリーをはてなブックマークに追加