ということで、某SIerが作成したテキストで全体研修を受けている。Cが終わってPHPの話になり、HTMLは研修で扱わないということだったけどPHPを扱う関係上HTMLはテキストに登場せざるを得ない。フォームのサンプルとして、こんなのが載っていた:
<p>
<form>
サンプルです<input type="text"><input type="submit">
</form>
</p>
さて、HTML4.01 Strict DTDを読んでみると:
<!ELEMENT P - O (%inline;)* -- paragraph -->
<!ENTITY % block
"P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT |
BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS">
<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM) -- interactive form --> <!ATTLIST FORM %attrs; -- %coreattrs, %i18n, %events -- action %URI; #REQUIRED -- server-side form handler -- method (GET|POST) GET -- HTTP method used to submit the form-- enctype %ContentType; "application/x-www-form-urlencoded" accept %ContentTypes; #IMPLIED -- list of MIME types for file upload -- name CDATA #IMPLIED -- name of form for scripting -- onsubmit %Script; #IMPLIED -- the form was submitted -- onreset %Script; #IMPLIED -- the form was reset -- accept-charset %Charsets; #IMPLIED -- list of supported charsets -- >
<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON"> <!-- %inline; covers inline or "text-level" elements --> <!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
これの意味するところは、P要素の子にはインライン要素しか来ず、FORM要素はブロック要素でありFORM要素の子にはFORM要素以外のブロック要素とSCRIPT要素しか来ず、INPUTやSELECTなどのフォームコントロール系要素はインライン要素であるということだ。つまり、件のHTMLはPの子にFORMが来ていることと、FORMの子にINPUTが来ていることが間違っている。さらに、FORM要素のaction属性は#REQUIREDなので必ず明示しなけばならない。もっともloose.dtdではFORM要素の子に%flow;が来れることになっているので、HTML 4.01 Transitionalにおいては2番目の指摘は間違いではない。しかし、Transitionalはその名の通り過渡的なものであって、これから作成するHTMLをわざわざTransitionalにするのは意図にそぐわない。まして、研修で扱うべきものではない。まあ、そのそもDoctype宣言とかもない謎HTMLなので、どのバージョンのHTMLに準拠した文書かわからないのだが。
もっとも、実装上、ほとんどの環境ではPの子にFORMが来ようがFORMのaction属性を省略しようが問題はない。しかしですね、さきほどまで学習していたCでは明示的にstdio.hをインクルードしてましたよね。おまじないとかで。GCCではstdio.hを明示的にインクルードしなくてもprintfなどのstdio.hで定義された関数を使うことができます。だからといってCの研修で#include <stdio.h>は省略してもいいよなんて言いませんよね。さっきまで学習していたCにもこういうレベルの誤りが含まれているのではないかと気が気でなくなります。テキストを通じて一定の品質を確保してほしいものですし、こういうところから、プログラマのマークアップ言語軽視が垣間見えるようで嫌な気分になります。
javadocが生成するHTMLも、PRE要素の子にIMGを置いている。階層構造を表現するのに手っ取り早いからとはいえ、これも同じような感じ。