[2] 文書型宣言は、 その文書の文書型及び文書型定義を宣言するマーク宣言です。 文書実体 (または部分文書実体) の最初の方に記述します。
[16] 文書型宣言と文書型定義: 文書型宣言と文書型定義はよく混同されますが、 別のものです。文書型宣言を使って記述するのが文書型定義です。
[14] ISO 8879 を元に文書型宣言の構文を ABNF で表すと、次のようになります。
文書型宣言 := mdo
DOCTYPE 1*dps 文書型名 [1*dps 外部部分集合参照
dps := s / 注釈 ;; ps − (引数実体参照 / Ee)
外部部分集合参照 := 外部識別子 [1*dps (CDATA / NDATA / SDATA) <内部部分集合で宣言される記法名> ] ;; Web SGML なら (見出し語 + 記法名) を使える [110]
[15] いいかげんな構文の図を描いてみました。
mdo->DOCTYPE-> ps -> Name --------------------+ \/ \/ \/ keyword -> ps ------------------> dso -> isub -> dsc | /\/\ | | | ps ---> mdc <-+ | | /\ /\ +-> SYSTEM -> ps -> syslit ----+ \/ /\ PUBLIC -> ps -> minlit -> ps
mdo # DOCTYPE # ps ---> rni # # Name keyword | | +---+---+<------------------r----------------------+ | | +---+---+ | | # | | ps ----+-------------------------+-------+ | | | # # # | | | SYSTEM PUBLIC keyword | | | | # | | | | | ps | | | | | # | | | | | | +---------- minlit | | | | | # # | | | | | $ ps | | | | | | | # $ r r | | | | syslit | | | | | | $ | # | | | | | | | | ps | | | | | | | | | | | | +-------+----+--+--+---------------+--+--+<-+ | | +-------+-----+-----+ r | # # | | dso otherwise ---------------+ | # | intsub | # | dsc | | +------+------+ # mdc
[5] 旧来の SGML では、文書型宣言は必須でした。 class としての文書型定義と、 instance である文書実体は常に対を成す必要があったからです。しかし、 文書型定義を全ての文書実体に含めなければならないとすると面倒で、 無駄でもあります。ですから、たいていは外部部分集合実体として外部 DTD を用意しておいて、 それを公開識別子やシステム識別子による参照として文書型宣言中に記述します。
[6] しかし、 >>5 のようにしていても、 ある文書では文書型定義の一部を修正したいということがあり得ます。 その時は、内部部分集合に差分の定義を書いておくことが出来ます。 もちろん、外部部分集合無しですべて内部部分集合に書いても構いません。
[9] Web SGML では、
LINK EXPLICIT NO
(明示連結不使用) かつCONCUR NO
(並行文書型不使用) かつIMPLYDEF DOCTYPE YES
又はIMPLYDEF ELEMENT YES
のとき、 SGML文書実体の前書きを省略できます。 このとき、次の暗黙の宣言が仮定されます。
(Web SGML K.4.9 参照。)
[12] 素の SGML は oo でいうところの class-based で、 Web SGML は prototype-based 風な特徴を取り入れてみたというところでしょか (といっても Web SGML に prototype はないですが)。
[13] 21世紀初頭の WWWブラウザの多くでは、 文書型宣言の記述によって CSS の解釈等を変更する DOCTYPEスイッチが実装されています。
DOCTYPE スイッチは WinIE の不具合など旧来の実装と本来の仕様に従った実装との互換性の問題への一つの解法として提案されたものですが、 文書型宣言の本来の役割に基づくものではありませんし、 何らかの規格としてまとめられているものでもありませんから、 著者の誤解と混乱を招いています。
[11] WinIE の DOCTYPE switch って XML宣言だけじゃなくて注釈宣言なんかでも効かなくなるのか。 どうしようもないなあ。
[1] マニアックな文法論議 - 文書型宣言の読み方
<http://www.ne.jp/asahi/minazuki/bakera/html/sgml/doctype>
[3] 規格参照具象構文や他の主要な具象構文では、
<!DOCTYPE html
PUBLIC "-//W3C//DTD HTML 4.01//EN">
のように記述します。
[4] >>3 の例では、文書型は html です。 -//W3C//DTD HTML 4.01//EN という公開識別子で識別される外部部分集合と、 空の内部部分集合で文書型定義は構成されます。
[17] カナかな団の躁鬱_2006_03_a <http://aboutworks.com/shokodei/diary/2006/2006_03_a.html#PrintNo1>
ワロス (名無しさん 2006-05-28 08:13:21 +00:00)
[18] HTML5 IRC logs: freenode / #whatwg / 20080130 ( 版) <http://krijnhoetmer.nl/irc-logs/whatwg/20080130#l-52>
[111] IRC logs: freenode / #whatwg / 20081015 ( 版) <http://krijnhoetmer.nl/irc-logs/whatwg/20081015#l-710>
[112] html-wg-94q3: Re: HTML 2.0 editing status ( 版) <http://ksi.cpsc.ucalgary.ca/archives/HTML-WG/html-wg-94q3.messages/0056.html>
<!DOCTYPE HTML>
を参照してください。