以前 DTD は役に立たないと書きましたが、詳しく説明しろというリクエストがあったので書いてみます。
そもそも SGML の DTD の役割として、マーク最小化のために必要な情報を記述することと、文書実現値が構文的に正しいと検証するための情報を記述することの2つがあります。前者の例として、どのタグが省略できるかの指定、要素の内容モデルにおける要素の順序の記述、属性の既定値の指定、短縮参照、データタグなどがあります。また、後者としては要素の内容モデルや属性型などがあります。
ですが、現実には Web ブラウザが HTML 文書を読み込むときにこれらの情報は使われません。 Web ブラウザは SGML とは異なる独自の方法で HTML 文書を構文解析します。そしてその結果が DTD に適合するかも検証しません。これまでそうであっただけではなく、これからもそうです*1 。 Web ブラウザに対して、あるいは Web ブラウザの利用者に対して DTD は何の利益も提供しません。
唯一 W3C Markup Validation Service は DTD を使っています。文書の妥当性を検証したい著者にとってはある程度の利益を得られるかもしれません。ですが、それも有害だという意見もあります。 blockquote
が引用であるかどうかのような意味的な正しさを検証できないのはどうにもできませんが、機械的に判断できるはずの要件すらすべてを検証できていないからです。 HTML4 ではブロック水準要素の子である ins
要素の子にブロック水準要素が来ることはできませんが、この条件が満たされているかは検証されません。 style
属性を使うときは Content-Style-Type
の指定が必要ですが、これも検証されません*2 。これは単に W3C の Validator が劣っているのではなく、 DTD の表現力自体に問題があります。にも関わらず、 DTD の妥当性検証を通過しただけで HTML 文書が正しいかのような誤解を与えています。
まとめますと、 DTD は実際のところ使われていないし、使おうにも能力不足なので、役に立たないということになります。ちなみに、 HTML 文書の正しさを調べたいなら Another HTML-lint のほうがよほど有用です。
少し補足いたしますと、 HTML4 までは HTML は SGML 応用である
とかいう現実と乖離しまくった建前がありましたので、どうしても形式的に DTD が必要でした*1 。しかし HTML5 が SGML を捨てることが事実上確定していますので、もはや名実共に DTD は必要ありません。
以上は HTML における DTD の話で、 XML DTD は多少事情が変わってきますが、たいして役に立たないことには変わりありません*2 。
今日のこの暑さはやばい。そろそろ単4電池が必要だw
これを W3C Markup Validation Service で妥当性検証してみると、 </head>
はここでは使えないとか、 <body>
はここでは使えないとか言われます。さてどうしてでしょう?
(答えを読むにはワッフルワッフルと書き込んでください)*1
こちらの (建物の) オーナーさんが光ファイバーを導入されましたので、簡単なモデムの確認をいたしますので、オートロックの方を開けて・・・
モデムの確認って何? オーナーさんが導入したならオーナーさんにオートロックを開けてもらえば?
いつものやつが売り切れ。不愉快だw
「特性と属性は何う云うニュアンスの違いがあるの?」みたいな話になって、段々わけがわからなくなってきた。んー。
(少なくてもこの分野では) ニュアンスの違いなどないのでは、というのが今までの感想です。
ちなみに The SGML Handbook (P.152, §4.4.3) では:
要素型が持つ特性には内容、共通識別子 (要素型名)、属性があるといっています。*1 ですが、この使い分けは一貫しておらず、同じ本の P10 (ISO 8879 Annex A) では共通識別子も属性だといっています。An element type can have properties other than its content and generic identifier. These properties, called
attributes, are defined by an attribute definition list declaration that associates anattribute definition listwith the element type.
属性は専門用語、
特性は非専門用語でしょう。
ただまあ、 HTML5 で profile 属性が削除されたこともありまして、 XMDP の役目は終わったのかなあと思います。 microformats の先駆けとしての XMDP の歴史的意義は大きいと思いますけどね。。。
いまや HTML は SGML 応用ではありませんし、 XHTML を text/html
とすることも不適切となりつつありますので、極めて時代遅れではありますが。。。
text/html
な文書中で文書型宣言の内部部分集合を使うと、Web ブラウザで表示させたときに、文書型宣言の末尾の ]>
の部分が文字データとして表示されてしまうことがあります。例えば、
<!DOCTYPE html [<-- -->]>
は、 ]>
が表示されてしまいます。これは、 Web ブラウザの HTML 構文解析器が内部部分集合内の注釈宣言の最後の >
で文書型宣言が閉じられたと判断するからです。昔から内部部分集合を使っていた人はこのごみ
をどうしようもないと諦めてきたようですが、処理指令と注釈宣言をうまく使えば、 XHTML としても妥当であり、かつ Web ブラウザでごみが表示されることもない文書を作ることができます。 (ただし本質的に意味を持たない処理指令や注釈宣言が文書に含まれてしまいます。ごみをもってごみを制するという感じでしょうか。)
実際どうすればよいかというと簡単で、
<!DOCTYPE html [<!-- --><?a ><!-- ?>]><?a --><? ?>
のように ]>
の周りを処理指令と注釈宣言で囲みます。こうすると Web ブラウザでもごみは表示されませんし、XML としても整形式になります。暇な方はどうしてこうなるのか考えてみてくださいw
先の例は、 XML として整形式であり、かつ Web ブラウザでごみが表示されることもありませんが、 HTML4 の SGML 宣言を使った SGML 文書としては非妥当です (文書型宣言が終わっていません)。 SGML 応用である HTML
の文書として妥当であるためにはもう一工夫必要になります*1 :
<!DOCTYPE html [<!-- --><?a ><![IGNORE[ ]><!-- ]]><? ?>]><?a --><? ?>
反則的ですがw、条件区間を使っています。 Gecko は <![
(マーク区間開始) から ]>
までを無視するようなので、ダミーの ]>
が入っています。
これで、 (適当な要素型宣言・属性定義並び宣言を足せば) 完全に妥当な SGML 応用である HTML
の文書になります。また、依然として XML としても整形式です。手元で確認した限り、 Firefox 1.5, Opera 9, WinIE 6 のいずれでもごみは表示されません。
?>
ですが、 HTML4 の pic は >
だからです。