Friday, August 11, 2006

XML, HTML と DTD

フォーマットが正しい XML 文書とは、開始タグが終了タグで閉じられている、属性が引用符で囲まれている、すべてのエンティティが宣言されている、などの条件を満たす文書のこと。

それとは別に、妥当な XML 文書とは、DTD を宣言し、その中で定義されているルールにしたがっている文書のことだ。

たとえば、Web アプリケーションの配備記述子である XML 文書は、次のように開始されている。


<?xml version="1.0" encoding="EUC-JP"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">


http://java.sun.com/dtd/web-app_2_3.dtd が DTD 文書である。これが、この XML 文書で使用できる合法的な構成要素を定義している。この文書には、

<!ELEMENT web-app (icon?, display-name?, description?, distributable?,
context-param*, filter*, filter-mapping*, listener*, servlet*,
servlet-mapping*, session-config?, mime-mapping*, welcome-file-list?,
error-page*, taglib*, resource-env-ref*, resource-ref*, security-constraint*,
login-config?, security-role*, env-entry*, ejb-ref*, ejb-local-ref*)>


のような定義がある。これは、配備記述子である XML 文書のルート要素が web-app であることと、それの子要素と多重度、子要素が親要素の中で出現する順番を定義している。ただ、Web コンテナがこの配備記述子を解釈するときに、URL で指定された DTD を読み込んでいるわけではないようだ。Web コンテナは最初から配備記述子のルールを知っているはずだからだ。このようにあらかじめ文書の定義について合意ができていれば、DTD は必要ではないはずだ。実際、XML では DTD は必須ではない。

HTML でも DTD を宣言することができる。たとえば、HTML 文書の先頭には

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">


を宣言することができる。これは、W3C が定義している HTML 4.01 の文書型定義(DTD)に準拠していることを宣言している。ブラウザによっては、この DOCTYPE 宣言を見て、HTML や CSS 解釈の挙動を変えたりする。宣言されていれば、HTML/CSS の仕様どおりの解釈をし、されていなければ過去の慣習的な「正しくない」解釈をする。Firefox や IE 6.0 は、この「DOCTYPE スイッチ」が機能する。

No comments: