目次 | 点数について | Another HTML-lint について |
---|---|---|
エラーについて | ゲートウェイサーヴィス | |
アクセス性について | 簡易ゲートウェイ | |
おまけ | 作者にビールをおごる | |
作者にビールをおごる |
出力されるエラーは、だいたい次のように分類されます。
各エラーが、それぞれどういう質のものなのかを * で示してあります。
あまりエラーが多いときは、チェックを打ち切るようにしています。打ち切られた行以降の文書には、もしかしたら重要なエラーが含まれているかも知れませんが、チェックされません。同じようなエラーばかり出ているときは、そのエラーをチェックしないようにしてみてから、もう一度チェックしてみるといいでしょう。
もしも、同じ行の同じエラーがずっと繰り返されている場合は、プログラムの不具合だと思われますので、是非お知らせください。
<TAG> の ATTR 属性の URI `XXXX` はインタネット上に存在しないかアクセスできません。 **
指定されているURIが実際に存在するのかチェックしますが、処理の迅速化のためにタイムアウトの時間はかなり短く設定されています(変更可)。それでも、サーバの反応が遅いリンクが多い場合は時間がかかるでしょう。http:
スキームのみチェックしています。ただし、正しくないURIのときはチェックしません。
メッセージの後に数字が付いている場合、それは、HTTPリクエストの結果のコードです。このコードは大きく分けて次のように分類されています。
100番台 | 通知 | |
200番台 | 成功 | |
300番台 | 移転 | |
400番台 | クライアントエラー | |
500番台 | サーバエラー |
これらのうち、このチェックで返ってくる可能性のあるコードでエラーとなるのは次のときです。
403 | アクセス権がない | |
404 | ファイルが存在しない | |
410 | サーバから削除された |
認証が必要なもの(401)などはそのリソースが存在することが明らかですし、サーバエラーのときは存在するのかしないのか不明なのでこのエラーは出ませんが、Another HTML-lint ではこのようなリソースの文法チェックをすることはできません。
HTTPのステータスコードに関して詳しくは、RFC1945、RFC2068、RFC2616などを見てください。
JavaScriptなどを利用して <BASE>
を動的に変更していたりする場合は正しくチェックできません。
HTMLをURLでなく、DATA領域に指定した場合は、このエラーはチェックされません。
一部のISPでは、受け付けるHTTPリクエストを制限していることがあります。このとき、「GETリクエストでチェック」オプションを指定していない場合は、すべてのURLに対して存在しないなどとエラーになりますのでご注意ください。
HTMLには、いろいろな仕様(ヴァージョン)があります。DOCTYPE宣言は、文書がHTMLであり、さらにどの仕様のHTMLで書かれているのかを明示するものです。DOCTYPE宣言がなくても、たいていのWWWブラウザは(自分の都合のいいように)HTMLを表示してくれますし、まじめにDOCTYPEによってHTMLの評価を変えてくれるWWWブラウザが現存するのかどうか知りません。しかし、DOCTYPE宣言は書くようにしましょう。とはいえ、Mozillaなどには対応するDOCTYPEがないので、にっちもさっちもいきません。
DOCTYPE宣言は、<!DOCTYPE 〜>
という書き方をします。"!"
を書き忘れていないかチェックしましょう。
HTMLの場合のDOCTYPE宣言は、<!DOCTYPE HTML 〜>
となります。実は、この中にあるHTMLという記述が、HTML全体をくくる <HTML>
〜</HTML>
を表わしているのですが、Another HTML-lint ではHTML以外は想定していません。
現在 Another HTML-lint がサポートしているDOCTYPEは以下のとおりです。文法はそれぞれのタグ一覧を表示します。言い訳ですが、規則ファイルから動的に生成しているため、あまり親切な一覧ではありません。なお、以下「DOCTYPEはありません」と書いてあるのは、公開識別子がないという意味です。
DOCTYPE宣言の意味については、文書タイプ宣言の意味などを見てください。特に、宣言末の "EN" というのは、宣言されているDTDが英語で書かれているという意味で、そのHTML文書がどうこういう意味ではありません。勝手に "JA" などに書き換えてはいけません。
また、HTML4.0がHTML3.2の上位互換などということはありません。ほとんどのHTMLにはこのような互換性はありません。
XHTMLでは、DOCTYPE宣言内にシステム識別子が必要です。
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML i18n//EN">
<!DOCTYPE HTMLPLUS SYSTEM "HTMLPLUS.DTD">
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN">
<!DOCTYPE HTML SYSTEM "html40-mobile.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
<!DOCTYPE html PUBLIC "-//OPENWAVE//DTD XHTML Mobile 1.0//EN" "http://www.openwave.com/DTD/xhtml-mobile10.dtd">
<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:2000//DTD HyperText Markup Language//EN">
<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:2000//DTD HTML//EN">
<!DOCTYPE Pre-HTML PUBLIC "ISO/IEC 15445:2000//DTD HyperText Markup Language//EN">
<!DOCTYPE Pre-HTML PUBLIC "ISO/IEC 15445:2000//DTD HTML//EN">
<!DOCTYPE HTML PUBLIC "-//Microsoft//DTD Internet Explorer 3.0 HTML//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD Compact HTML 1.0 Draft//EN">
もしも、あなたが使用しているDOCTYPEがここになくて、そのDTDが存在している場合は、お知らせくだされば、追加できるかも知れません。
以下は、よくある間違った宣言です。
<!DOCTYPE HTML PUBLIC "HTML 3.0">
<!DOCTYPE HTML PUBLIC "HTML 3.2">
<!DOCTYPE HTML PUBLIC "-//IBM//DTD HPB HTML//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD W3 HTML//EN">
最初の3つは IBM HomePage Builder が、最後のは Internet Explorer 4.0 が生成するようです。
DOCTYPE宣言に指定されている公開識別子の大文字小文字が正しくありません。 *6*
DOCTYPE宣言中の "-//W3C//DTD HTML 4.01 Transitional//EN"
などの公開識別子の大文字小文字は区別されます。
XXXX は Another HTML-lint ではサポートされていない DOCTYPE宣言です。
既知のいくつかの未サポートのDOCTYPE宣言に対して警告されます。
HTML3.0 はすでに廃棄されたHTMLです。使わないようにしましょう。 *3*
DOCTYPEに宣言されているHTML2.0やHTML3.0などは、すでに破棄されてしまった仕様です。使わないようにしましょう。
HTML4.0 はあまり薦められないHTMLです。HTML4.01 を使いましょう。 *3*
DOCTYPEに宣言されているHTML4.0は、使うことが薦められていません。改訂版のHTML4.01を使いましょう。この警告は減点されません。
指定されている XXXX は DOCTYPE宣言と一致しません。DOCTYPE宣言を無視します。
指定されたDOCTYPEが正しいかどうか、特にスペルミスがないかチェックしましょう。
DOCTYPE宣言は文書の先頭でなければなりません。 *5*
DOCTYPE宣言は、コメントやXML宣言を除く文書の先頭に書かなければなりません。つまり、<HTML>
より前に書かなければなりません。
DOCTYPE宣言中の `HTML` は小文字で書かなければなりません。 *5*
DOCTYPE宣言 <!DOCTYPE HTML 〜>
にある HTML
というのは、HTML文書が <HTML>
〜</HTML>
で囲まれていることを示すものです。XML(J)では、要素名や属性名の大文字小文字が区別されます。大文字の <HTML>
と小文字の <html>
とは別物に解釈されます。すべての要素名が小文字のXHTML1(J)では、小文字の html
でDOCTYPE宣言しなければなりません。
DOCTYPE宣言中の `!doctype` や `public` は大文字で書かなければなりません。 *5*
XHTMLでは、DOCTYPE宣言は大文字でしなければなりません。
システム識別子は、DOCTYPE宣言中にあるDTDの所在を示す情報で、次のようなもの。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
XHTMLでは、システム識別子を書かなければなりません。
DOCTYPE宣言に指定されているシステム識別子が正しくありません。 *6*
DOCTYPE宣言中に指定されているシステム識別子が正しくありません。公開識別子に対応するシステム識別子は決まっています。
DOCTYPE宣言に指定されているシステム識別子の大文字小文字が正しくありません。 *5*
DOCTYPE宣言中に指定されているシステム識別子の大文字小文字が一致していません。
SGML宣言や DTD宣言などと思われる <!XXXX 〜> は無視します。
<!SGML 〜>
とか <!ELEMENT 〜>
とかいう宣言は、DOCTYPEを除いてすべて無視します。実際に存在する宣言かどうかはチェックしないので、でたらめな <!USO800 〜>
とかでも黙って無視されます。実際には次のような宣言が存在します。
<!SGML 〜> |
<!DOCTYPE 〜> |
<!ELEMENT 〜> |
<!ATTLIST 〜> |
<!ENTITY 〜> |
<!NOTATION 〜> |
<!SHORTREF 〜> |
<!USEMAP 〜> |
もしも、タグをコメントアウトするつもりで "<!IMG 〜>"
などと書いているなら、それは "<!--IMG 〜-->"
と書かなければなりません。
マーク区間 <![XXXX[ 〜 ]]> は、多くのブラウザは理解できません。 **
マーク区間というのは、<![CDATA[ 〜 ]]>
のようにしてSGML文書の一部分にいろいろな性格付けをしたりするものですが、多くのWWWブラウザはこの書式を理解できませんし、Another HTML-lint もきちんとは解釈できません。HTML4.01(J)にもあまり使わない方がいいと言及があります。
マーク区間には次のようなものがありますが、いちいちスペルチェックはしていません。
<![CDATA[ 〜 ]]> |
<![RCDATA[ 〜 ]]> |
<![IGNORE[ 〜 ]]> |
<![INCLUDE[ 〜 ]]> |
<![TEMP[ 〜 ]]> |
XHTML1(J)では、<SCRIPT>
などの要素がCDATAではなく#PCDATAになっているので、旧来のように記述するためには、
<script> <![CDATA[ ... unescaped script content ... ]]> </script>
としなければならなくなりました。Another HTML-lint では、CDATAマーク区間のみ、HTML4以上に限って解釈しています。他のマーク区間は、入れ子の関係が許されたりいろいろ複雑なので、かなり大雑把にしか扱っていませんし、意味を斟酌してもいません。覚え書きを見てください。
また、構文上 <![ CDATA [
のように空白を含められるのですが、手抜き実装のため、複数行に渡っての記述は解釈できません。閉じる場合も同様です。
この警告は減点されません。
一般のマーク区間中には、次の文字列を記述することはできません。XML(J)。
]]> |
< |
& |
CDATAマーク区間では、次の文字列が書けないことになっています。
]]> |
スクリプトやスタイルシートの記述中にこういう字面を含むようなものをHTML中に埋め込むことはできません。そのようなときは外部にスクリプトやスタイルシートを用意しなければなりません。
ただし、チェックはCDATAマーク区間のみHTML4以上に限って行なっています。実際にこのエラーが出ることはありません。
NN行目のマーク区間 <![XXXX[ が閉じられていません。 *6*
マーク区間が閉じられていません。閉じる場所に関しては Another HTML-lint は無頓着です。
<?xml
で始まるXML宣言は、文書の先頭に書かなければなりません。つまり、DOCTYPE宣言よりも前に書かなければなりません。
XHTML では XML宣言をすることが強く求められています。 *3*
XHTML1(J)では、XML宣言をするように強く求められています。例えば次のようなもの。
<?xml version="1.0" encoding="UTF-8"?>
一般のSGML処理命令を閉じるのは ">"
ですが、XML宣言を閉じるのは "?>"
でなければなりません。
XML宣言の書式はXML(J)で決められています。ここで、属性の順序なども固定的であることに注意してください。Another HTML-lint では、具体的な属性値に立ち入ってまではあまりチェックしていません。
Another HTML-lint はXML(J)を解釈できないので、XMLに対して文法チェックしてもあまり意味がありません。実際には、"<?"
はXMLに限らず、一般のシステム依存の何かの処理命令を示すマーク付けです。HTML4.0(J)にあるように、一般的には処理命令を閉じるのは ">"
ですが、XML宣言を閉じるのは "?>"
です。
古いWWWブラウザなどは、処理命令がそのまま表示されてしまうことがあります。この警告は減点されません。
HTML中でのコメントは、"<!-- 〜 -->"
と書きますが、この "〜" の部分に "--" を書くには注意が必要です。RFC1866(J)では、"--" と "--" の間がコメントとみなされ、その組が複数回現れてよく、それらの組と組の間は空白文字だけが書ける、となっています。つまり、次のような書き方は間違いです。
<!-----------> <!-- FOO -- BAR -- BAZ -->
最初の例は、"--" が正しく組になっていませんし、次の例は組と組の間が空白ではありません。以下の例は正しいのです(ただしRFC1866として)。
<!------------> <!-- FOO -- -- QUZ -->
上の例は、ハイフン "-" が 12個で、ちょうどうまく組になるのです。
Another HTML-lint では、このような正確な仕様を調べるのではなく、単純に余計な "--" が現れただけで警告するようにしています。しかし、多くのWWWブラウザでは、このようなコメント中のハイフンの扱いについては、相当寛容です。
HTML4.0(J)では、コメント中に 2個以上連なったハイフンは書かないように、とされています。XML(J)でも禁止です。つまり、上の例はすべて誤りです。
RFC1866(J)では、空のコメント "<!>"
は、"--" がゼロ組のコメントとして正しいコメントとされています。でも、書かない方がいいでしょうね。混乱の元です。XML(J)にはこのような表記は存在しません。
このコメントのような記述 `<!->` は正しくありません。 *6*
次のようなのは、そもそもコメントとして正しくありません。こういうのを書いてはいけません。
<!-> <!--> <!--->
<TITLE> 中にはコメントを書かないようにしましょう。 *3*
<TITLE>中には、コメントも含めてテキスト以外は書かないようにとされています。HTML4.01(J)を見てください。
コメント中に `<` や `>` を書くと、いくつかのWWWブラウザを混乱させることがあります。 *
HTMLの一部をまとめて
<!-- <A href="〜">なんたら</A> -->
のようにコメントアウトすることはごく普通に行なわれると思いますが、一部のWWWブラウザでは、
<!-- <A href="〜">
までをコメントとみなしてしまうものがあるそうです。これは、WWWブラウザが悪いというよりも、古いHTMLでこのような実装がされ得ていたようです。今時のWWWブラウザではこんなことはないようです。この警告は減点されません。
コメントを入れ子にすることはできません。
<!-- <!-- かんたら --> -->
このようなとき、多くのWWWブラウザでは、
<!-- <!-- かんたら -->
までがコメントとみなされて、残りが宙に浮いてしまいます。SGML的には「かんたら」の部分が非コメント部分とみなされてうまくありません。
閉じコメントの `--` と `>` の間には空白を入れないようにしましょう。 *
仕様上は、"<!-- 〜 -- >"
と書いてもいいことになっています(XML(J)では禁止)。しかし、逆に "<! -- 〜 -->"
とすることは禁じられています。このときは、< とタグ要素名の間に空白が含まれていると警告されます。
閉じコメントは `--!>` ではなく `-->` です。 *6*
読んで字の如くです。WWWブラウザによっては気を利かせて "--!>"
の位置でコメントを閉じてくれますが、そうでない場合は、その後ろの記述がずっと無視されることになります。
また、コメントを "<!- 〜 ->"
と勘違いしている人もあるようです。
"<!--"
が現れたのに "-->"
が最後まで現れなかったときの警告です。コメントを入れ子にしたりして、どこか間違えたのでしょう。
タグが "<"
で始まったのに ">"
が最後まで現れなかったときの警告です。
`<` と `TAG` の間には空白を入れてはいけません。 *6*
タグの開始は、"<TAG"
のように続けて書かなければなりません。"< TAG"
のように書いてしまうと、タグとして認めてもらえません。もしも、"<"
を "<"
という文字の意味で書いたのなら、それはそれで "<"
と書かなければなりません。これについては、実体参照に関する警告を参照してください。
特許出願用HTMLでは、これが許可されているのですが、あまりにもひどい許容なので、この場合でも警告されます。
予期せぬ `<` が <TAG> 内にあります。閉じられていないタグの可能性があります。 *6*
閉じるのを忘れたタグの後に正しいタグがある場合に出ることが多い警告です。
<A href="〜"><IMG src="〜" </A>
といった調子です。このとき、</A>
の前に ">"
が補われます。
もっと本当のことを言えば、実はこれはSGML的には間違っているとは言えません。SGML宣言で SHORTTAG YES のときにはタグの連続で直前のタグの >
を省略してもいいことになっているからです。HTMLはどれも SHORTTAG YES です。終了タグだって、それがどの開始タグに対応するか自明な場合は </>
としてもいいとか、もっといろいろあるんですが、そこまで正しいSGML的解釈をWWWブラウザに期待できません。HTML4.0(J)などを見てください。
空要素タグ <TAG> は <TAG /> として閉じなければなりません。 *5*
XHTML1(J)では、<br>
や <hr>
などの空要素タグは、<br />
や <hr />
と書かなければなりません。
実際には、<br></br>
と書いてもOKです。終了タグがないときの警告も参照してください。
空要素タグ <TAG> を閉じるときは `/>` に空白を先行させましょう。 *3*
XHTML1(J)では、XMLを解さないユーザエージェントのために、空要素タグを閉じるときは <br />
や <hr />
のように />
の前に空白を先行させるように薦められています (Appendix C.2)。
なぜこれでXMLを解さないユーザエージェントのためになるのかというと次のような理由によるようです。
/ は、要素名とはなり得ない文字なのですが、<br/>
という記述に対して古いユーザエージェントは br/
を要素名とみなし、未知のタグということで無視してしまうようです。これを <br />
とした場合は、既知の br
なのでちゃんと改行される。ということのようです。
XML(J)ではこの空白はあってもなくても構いません。
非空要素タグ <TAG> を `/>` で閉じることはできません。 *5*
XHTML1(J)では、<p>
などの非空要素タグに対して、<p></p>
を <p />
と表記してはならないことになっています (Appendix C.3)。
<TAGA> を NN行目の <TAGB>〜</TAGB> 内に書くことはできません。 *6*
タグには開始タグ <TAG>
と終了タグ </TAG>
の対で用いられるものが多くあります。このタグの要素として、何が書けて何が書けないかは明確に決められています。
HTML4.0 Strict(J)では、ブロックレベル要素とインライン要素の区別が厳格になっているので、「あれ? どうしてこれがエラーなの」と疑問に思うものが多いかも知れません。例えば、<BODY>
や <FORM>
内に直接インライン要素を書くことができなくなっています。<A>
や <INPUT>
などはインライン要素なので、次のようなのは HTML4.0 Strict では誤りとなります。
<BODY> <A>リンク</A> ← <A> は <BODY> に書けないと警告 <FORM> <INPUT>何故? ← <INPUT> は <FORM> に書けないと警告 </FORM> </BODY>
これは、例えば次のようにします。
<BODY> <P> <A>リンク</A> </P> <FORM> <P> <INPUT>何故? </P> </FORM> </BODY>
DOCTYPEの意味をわからずに、「とにかくHTML4.0のやつ」と不用意に宣言している人はこの警告を大量に食らうことになります。そういう人は、とりあえずHTML4.0 Transitionalな宣言を付けましょう。そしてその意味を勉強してください。
HTML4.0以外でも、気付きにくい有名なよくある(ほんとによくあるのか?)間違いとして、
<A href="〜"><H3>ぽよよん</H3></A>
というのがあります。HTML3.2やHTML4.0などでは、<A>
〜</A>
内には <H3>
などは書くことができません(しかし、なんとHTML2.0では書けるので間違いではないんだけど、、、)。正しくは
<H3><A href="〜">ぽよよん</A></H3>
とします。しかしWWWブラウザは寛容なので、たいていどちらもそれなりに表示します。
また、</A>
を書いていない場合にもこの警告がよく出ます。
<A href="yama.html">おじいさんはやまにしばかり <A href="kawa.html">おばあさんはかわにせんたく
なんていう書き方をしているときです。</A>
は省略できないタグなので、<A>
〜</A>
の中に <A>
が書かれていると解釈されますが、<A>
〜</A>
の中に <A>
は書けません。
<UL>
や <OL>
を入れ子にしてこの警告を受け、「<UL>
って入れ子にできないんだっけ」と疑問に思われる方もいるようです。
<UL> <UL>〜</UL> </UL>
これは正しくありません。<UL>
を入れ子にするには、
<UL> <LI><UL>〜</UL></LI> </UL>
という風にしなくちゃならない。後ろの </LI>
は省略可。
<TABLE>
で <TR>
を書かなかったために、<TBODY>
内に <TD>
が書けないと言われることもHTML4.0ではよくあります。
<TABLE> <TD>〜</TD> </TABLE>
「<TBODY>
なんて聞いたこともないぞ」と驚かないでください。たいてい <TR>
を忘れているために出るエラーです。
もうひとつの間違いとして、<NOFRAMES>
を <HTML>
直下に書いていることがあります。多くの参考書でもそう書かれていますが、これは間違いです。正しくは、<FRAMESET>
〜</FRAMESET>
内に書かなければなりません。しかもこの間違いを犯している参考書は、<NOFRAMES>
ではなくて、<NOFRAME>
と書いていることが多いようです。<NOFRAME>
というタグは存在しません。いくらWWWブラウザが <NOFRAME>
を許容しているとはいえ、正しいタグを書くようにしましょう。
Laura Lemay のHTML入門に、<PRE>
〜</PRE>
内に <IMG>
を書く例が載っているけど、現在のHTMLでは禁止されています。これはこの本の書かれた時点のHTMLが古いからです。と、思っていたのですが、HTML1.0でもそのようなことはできないことがわかりました。HTML+ではできるようです。
HTML4.0(J)での <INS>
と <DEL>
は、それらがどの要素中で使用されるかによって、書ける要素が違います。つまり、インライン要素として記述した場合はブロックレベル要素は書けません。
<P> <INS><DIV>…これはブロックレベル要素…</DIV></INS> </P>
この例は正しくありません。<P>
の中に <DIV>
は書けないからです。
<TAGA> を NN行目の <TAGB>〜</TAGB> 内に書くことはあまり薦められません。 *3*
とりあえず書いても大丈夫ですが、薦められていません。将来的に書けなくなる可能性があります。この警告は減点されません。
<TAGA> を <TAGB>〜</TAGB> の外に書くことはできません。 *3*
タグによっては、ある条件で特定のタグの要素内にしか書けないものがあります。多くは内部に書けないと警告されますが、DTDで規定できない場合はこの警告が出ます。
<IMG ISMAP>
は、<A HREF>
〜</A>
の外には書けません。これは、HTML2.0 や ISO/IEC 1544 などに書かれています。
<TAGA> は <TAGB>〜</TAGB> 内に1度しか書けません。NN行目にもありました。 *6*
タグによっては何度も書けないものがあります。<BODY>
や <TITLE>
や <CAPTION>
などいろいろあります。これらは、HTML中で一度だけ書けるという意味ではなく、<BODY>
ならばそれを書くことができる <HTML>
〜</HTML>
内で一度という意味です。<HTML>
は一度しか書けないので <BODY>
も一度しか書けないことになりますが、<CAPTION>
は <TABLE>
〜</TABLE>
内で一度です。<TABLE>
は何度でも書けるので、<CAPTION>
自体はHTML中に何度も現れることがあります。
<TAGA> は NN行目の <TAGB> と同時に <TAGC>〜</TAGC> 内に書くことはできません。 *6*
例えば、HTML4.0(J)では、<BODY>
と <FRAMESET>
は、どちらも <HTML>
〜</HTML>
内に書くタグですが、両方を書くことはできません。これは、このような制限のあるタグに対する警告です。
<TAGA> は </TAGB> の直後に続かなければなりません。 *6*
決まった順序で書かなければならないタグがいくつかあります。<HTML>
〜</HTML>
内では、<HEAD>
の次に <BODY>
という順序でなければなりませんし、<TABLE>
〜</TABLE>
内では、<CAPTION>
を <TR>
などの後に書くことはできません。
<DD> は </DT> の直後に続かなければなりません。 *3*
<DL>
要素内には <DT>
タグと <DD>
タグが書けるのですが、ひとつの <DT>
に対して、いくつも <DD>
を書くようなやり方は、RFC1866(J)では推奨されていません。
<DL> <DT>見出し1 <DD>〜 <DT>見出し2 <DD>〜
は、もちろんいいのですが、
<DL> <DT>見出し1 <DD>〜 <DD>〜
は、だめということです。次のように <DD>
がないのはいいようです。
<DL> <DT>見出し1 <DT>見出し2 <DD>〜
<DD>
を複数続けたいような場合は、例えば <BR>
を使えばいいでしょう。
これに関して、HTML+のDTDでは次のように定義されています。これは、DLの内容はひとつ以上の連続するDTにひとつのDDが続いた組がひとつ以上、と読みます。つまり、HTML+ではDDを続けることは禁止されています。
<!ELEMENT DL - - (DT+,DD)+>
RFC1866(J)以降では次のように定義されています。これは、DLの内容はDTまたはDDがひとつ以上、と読みます。順序の規定は含まれていません。
<!ELEMENT DL - - (DT|DD)+>
HTML+が 1993/11、RFC1866 が 1995/11 なので、RFC1866の記述はHTML+の名残、あるいは修正漏れの可能性が大です。
HTML4.0(J)には、<DD>
を連続させた例が載っています。ということは、HTML4.0では、DTDどおりに、こう書いても問題なしとなったんでしょう。HTML4.0以上では <DD>
の連続に対してこの警告は出ません。
<TAGA>〜</TAGA> 内には <TAGB> が必要です。 *6*
必ず書かなければならない要素があります。例えば、<HEAD>
〜</HEAD>
内に <TITLE>
は必要です。
ある種のタグは、要素が空であるのが好ましくないことがあります。例えば、
<ADDRESS></ADDRESS>
などというのでは、何のための <ADDRESS>
なのかわかりません。特に、<P>
を <BR>
の代わりに改行の意味で使っていたりすると、</P>
が省略されているとみなされて、さらにこの警告が出ることが多くなります。<P>
は段落のためのタグであり、改行のためにあるのではありません。
また、
<A name="anchor"></A>
としたのでは、Lynxなど一部のWWWブラウザではそこに飛べなくなってしまいます。文法的には間違っていないし、同じ場所に複数の名前を付けたりするのはよくやることだと思いますし、そもそもアンカーはその一点に指定するのであって、ある範囲に指定するのではありません。Lynxなどが飛べないのは、不具合に近いと思います。なお、最近のLynx(2.8.1)ではそのようなことはないようです。
<TAG> と </TAG> の間に空白文字しか含まれていません。 *3*
あるWWWブラウザで半角空白と異なる振る舞いをするからといって、全角空白 □
を利用して、<P>□</P>
のように空白だけの要素を書いて桁揃えをしようとする試みが数多く行なわれています。これは、偶然うまくいくかも知れませんが、好ましくありません。しかし、これらが何らかの別の正当な意図的な目的で行なわれていないとも限りません。ここでは、全角空白の他に、半角カタカナ空白である  
 
や、
も含めて空白文字とみなしています。
<TD>
などの内容を空白だけにして、何らかの視覚効果を狙うのは、スタイルシートで行なうようにと、アクセス指針CSS技術文書に書かれています。この警告は減点されません。
<TAG>〜</TAG> 内には空白以外に <BR> しか含まれていません。 *
<P>
を <BR>
のように使っていたら警告されたので <BR>
に変えたら、今度は <BR>
を <BODY>
〜</BODY>
内に書くことはできないと警告された。そこで <P><BR></P>
と書いた。ということがあるのだそうです。
本質を理解しないまま満点を目指した結果なのですが、意図的に <P><BR></P>
と書かないとも言いきれません。
<P>
<TD>
<TH>
に対してだけ警告されます。この警告は減点されません。
<TAG> は不明なタグです。 *5*
文字どおり間違ったタグを書いています。スペルミスなどの可能性があります。多くの参考書で紹介されている <NOFRAME>
というのは <NOFRAME