DOCTYPE宣言

文書型宣言 (XML、SGML)

[2] 文書型宣言 (Document type declaration) は、 その文書文書型及び文書型定義宣言するマーク宣言です。 文書実体 (または部分文書実体) の最初の方に記述します。

[16] 文書型宣言と文書型定義: 文書型宣言 (Document type declaration) 文書型定義 (document type definition) はよく混同されますが、 別のものです。文書型宣言を使って記述するのが文書型定義です。

[113] HTML における DOCTYPE については、 <!DOCTYPE HTML> を参照してください。

構文

[14] ISO 8879 を元に文書型宣言の構文を ABNF で表すと、次のようになります。

構文図

[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 では、

のとき、 SGML文書実体前書きを省略できます。 このとき、次の暗黙の宣言が仮定されます。

IMPLYDEF DOCTYPE YES のとき
<!DOCTYPE #IMPLIED SYSTEM>
IMPLYDEF DOCTYPE NO のとき
<!DOCTYPE #IMPLIED>

(Web SGML K.4.9 参照。)

[12] 素の SGML は oo でいうところの class-based で、 Web SGML は prototype-based 風な特徴を取り入れてみたというところでしょか (といっても Web SGML に prototype はないですが)。

DOCTYPE switch

[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>

[19] Windows RSS Publisher's Guide (work-in-progress) - Microsoft RSS Blog - Site Home - MSDN Blogs ( 版) <http://blogs.msdn.com/b/rssteam/archive/2005/08/02/publishersguide.aspx>

To limit the impact that feeds with DTDs can have on a user’s computer, the RSS Platform’s parser rejects all feeds that contain references to DTDs and IE7 displays an error instead of showing the feed reading view.

[20] RFC 6241 - Network Configuration Protocol (NETCONF) () <https://tools.ietf.org/html/rfc6241#section-3.2>

Document type declarations (see Section 2.8 of

[W3C.REC-xml-20001006]) MUST NOT appear in NETCONF content.