| 目次 | 点数について | Another HTML-lint について |
|---|---|---|
| エラーについて | ゲートウェイサーヴィス | |
| アクセス性について | 簡易ゲートウェイ | |
| おまけ | ||
| プライマリサイト |
出力されるエラーは、だいたい次のように分類されます。
各エラーが、それぞれどういう質のものなのかを * で示してあります。
あまりエラーが多いときは、チェックを打ち切るようにしています。打ち切られた行以降の文書には、もしかしたら重要なエラーが含まれているかも知れませんが、チェックされません。同じようなエラーばかり出ているときは、そのエラーをチェックしないようにしてみてから、もう一度チェックしてみるといいでしょう。
もしも、同じ行の同じエラーがずっと繰り返されている場合は、プログラムの不具合だと思われますので、是非 k16@chiba.email.ne.jp までお知らせください。
<TAG> の ATTR 属性の URI `XXXX` はインタネット上に存在しないかアクセスできません。 **
指定されているURIが実際に存在するのかチェックしますが、処理の迅速化のためにタイムアウトの時間はかなり短く設定されています(変更可)。それでも、サーバの反応が遅いリンクが多い場合は時間がかかるでしょう。http: スキームのみチェックしています。ただし、正しくないURIのときはチェックしません。
メッセージの後に数字が付いている場合、それは、HTTPリクエストの結果のコードです。このコードは大きく分けて次のように分類されています。
| 100番台 | 通知 | |
| 200番台 | 成功 | |
| 300番台 | 移転 | |
| 400番台 | クライアントエラー | |
| 500番台 | サーバエラー |
これらのうち、このチェックで返ってくる可能性のあるコードでエラーとなるのは 400番以降のときです。しかし、確実にリソースが存在しないかアクセスできないのは次の場合くらいです。
| 403 | アクセス権がない | |
| 404 | ファイルが存在しない | |
| 410 | サーバから削除された |
認証が必要なもの(401)などはそのリソースが存在することは明らかですし、サーバエラーのときは存在するのかしないのかは不明です。Another HTML-lint ではこのようなリソースの文法チェックをすることはできません。
LWPでなくhttpreq.plを使っているとき、1桁のコードが返ることがあります。それは、HTTPリクエスト以前にエラーが発生したときで、次のような意味です。
| 2 | IPが得られない | |
| 3 | ホストに接続できない | |
| 4 | タイムアウト |
LWPでは、DNSが引けずにIPが得られない場合、500番のコードを返します。
HTTPのステータスコードに関して詳しくは、RFC1945、RFC2068、RFC2616などを見てください。
JavaScriptなどを利用して <BASE> を動的に変更していたりする場合は正しくチェックできません。
HTMLをURLでなく、DATA領域に指定した場合は、このエラーはチェックされません。
一部のISPでは、受け付けるHTTPリクエストを制限していることがあります。このとき、「GETリクエストでチェック」オプションを指定していない場合は、すべてのURLに対して存在しないなどとエラーになりますのでご注意ください。
HTMLには、いろいろな仕様(ヴァージョン)があります。DOCTYPE宣言は、文書がHTMLであり、さらにどの仕様のHTMLで書かれているのかを明示するものです。DOCTYPE宣言がなくても、たいていのWWWブラウザは(自分の都合のいいように)HTMLを表示してくれますし、まじめにDOCTYPEによってHTMLの評価を変えてくれるWWWブラウザが現存するのかどうか知りません。しかし、DOCTYPE宣言は書くようにしましょう。とはいえ、MSIEやMozillaなどには対応するDOCTYPEがないので、にっちもさっちもいきません。
DOCTYPE宣言は、<!DOCTYPE 〜> という書き方をします。"!" を書き忘れていないかチェックしましょう。
HTMLの場合のDOCTYPE宣言は、<!DOCTYPE HTML 〜> となります。実は、この中にあるHTMLという記述が、HTML全体をくくる <HTML>〜</HTML> を表わしているのですが、Another HTML-lint ではHTML以外は想定していません。
DOCTYPE宣言の前に何か制御文字が含まれています。 **
DOCTYPE宣言の前に、何か制御文字が含まれています。これは、JISのエスケープコードなど、不可視かも知れません。バイナリダンプなどでの調査が必要かも知れません。
現在 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 html PUBLIC "-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/1.0) 1.0//EN" "i-xhtml_4ja_10.dtd">
<!DOCTYPE html PUBLIC "-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/1.1) 1.0//EN" "i-xhtml_4ja_10.dtd">
もしも、あなたが使用しているDOCTYPEがここになくて、そのDTDが存在している場合は、k16@chiba.email.ne.jp までお知らせくだされば、追加できるかも知れません。
以下は、よくある間違った宣言です。
<!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宣言に対して警告されます。
HTMLXXXX はすでに廃棄された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 では、具体的な属性値に立ち入ってまではあまりチェックしていませんが、version="1.0" であることはチェックされます。
Another HTML-lint はXML(J)を解釈できないので、XMLに対して文法チェックしてもあまり意味がありません。実際には、"<?" はXMLに限らず、一般のシステム依存の何かの処理命令を示すマーク付けです。HTML4.01(J)にあるように、一般的には処理命令を閉じるのは ">" ですが、XML宣言を閉じるのは "?>" です。
古いWWWブラウザなどは、処理命令がそのまま表示されてしまうことがあります。この警告は減点されません。
HTML中でのコメントは、"<!-- 〜 -->" と書きますが、この "〜" の部分に "--" を書くには注意が必要です。RFC1866(J)では、"--" と "--" の間がコメントとみなされ、その組が複数回現れてよく、それらの組と組の間は空白文字だけが書ける、となっています。つまり、次のような書き方は間違いです。
<!-----------> <!-- FOO -- BAR -- BAZ -->
最初の例は、"--" が正しく組になっていませんし、次の例は組と組の間が空白ではありません。以下の例は正しいのです(ただしRFC1866として)。
<!------------> <!-- FOO -- -- QUZ -->
上の例は、ハイフン "-" が 12個で、ちょうどうまく組になるのです。
Another HTML-lint では、このような正確な仕様を調べるのではなく、単純に余計な "--" が現れただけで警告するようにしています。しかし、多くのWWWブラウザでは、このようなコメント中のハイフンの扱いについては、相当寛容です。
HTML4.01(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.01(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)ではこの空白はあってもなくても構いません。メディアタイプが application/xhtml+xml である場合は警告されません。
空要素タグ <TAG> の要素には空白さえも含めることはできません。 *6*
XMLの Content of Elements(J)では、空要素タグは、<tag></tag> のように開始タグと終了タグをくっつけて書かなければならないとされてます。つまり、空白も含めることはできません。
空要素タグは <TAG /> と書くようにしましょう。 *3*
XHTMLのガイドライン C.3(J)には、後方互換性のために、空要素タグは、<tag></tag> ではなくて、<tag /> と書くようにとされています。
メディアタイプが application/xhtml+xml である場合は警告されません。
非空要素タグ <TAG> を `/>` で閉じることはできません。 *5*
XHTML1(J)では、<p> などの非空要素タグに対して、<p></p> を <p /> と表記してはならないことになっています (Appendix C.3)。
メディアタイプが application/xhtml+xml である場合は警告されません。
<TAGA> を NN行目の <TAGB>〜</TAGB> 内に書くことはできません。 *6*
タグには開始タグ <TAG> と終了タグ </TAG> の対で用いられるものが多くあります。このタグの要素として、何が書けて何が書けないかは明確に決められています。
HTML4.01 Strict(J)では、ブロックレベル要素とインライン要素の区別が厳格になっているので、「あれ? どうしてこれがエラーなの」と疑問に思うものが多いかも知れません。例えば、<BODY> や <FORM> 内に直接インライン要素を書くことができなくなっています。<A> や <INPUT> などはインライン要素なので、次のようなのは HTML4.01 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.01 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.01ではよくあります。
<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.01(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.01(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.01(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> というのは <NOFRAMES> の誤りです。また、<CENTER>〜</CENTER> はあっても、<LEFT>〜</LEFT> なんてのはありません。
各HTMLがどういうタグをサポートしているのかの一覧もあるので参考にしてください。
チェックしているHTMLのヴァージョンではサポートされていないが、他のヴァージョンでサポートされているタグです。あまりこの警告が大量に出るようなら、DOCTYPE宣言が適切でない可能性があります。 各HTMLがどういうタグをサポートしているのかの一覧もあるので参考にしてください。
このタグは、すたれつつあるタグです。将来はサポートされなくなる可能性があるので、使わないようにしましょう。例えば、次のように代替のタグを使います。
<CENTER> | → | <DIV align="center"> |
<DIR> | → | <UL> |
<MENU> | → | <UL> |
<ISINDEX> | → | <INPUT> |
<XMP> | → | <PRE> |
<APPLET> | → | <OBJECT> |
ただし、HTMLのヴァージョンによって警告されるタグが異なりますし、単純に要素名だけ替えればいいというわけではないので注意してください。
<TAG> はあまり薦められないタグです。スタイルシートを使いましょう。 *3*
HTML4.01では、<FONT> や <U> などが薦められないタグになっています。これらのタグは、文書構造を記述するという本来の目的からは外れたタグとして、スタイルシート(CSS1(J)/CSS2(J))を利用しなさい、ということです。それにしては、<B> や <I> などは外されていません。この警告は減点されません。
<TAG> は Another HTML-lint では正確な評価はできません。
MSIE5.0でサポートされている <XML> や、<HTML xmlns:namespace> で宣言される custom Element を正確に解釈することはできません。
<XML> は、HTML中にXMLを挿入するのに用いますが、Another HTML-lint ではXML名前空間等の解釈をすることはできません。<XML>〜</XML> 内に書かれるタグは、開始終了タグの対応関係以外はチェックされません。この警告は減点されません。
<BLINK> や <MARQUEE> といったタグは使うべきでないと、WAI で名指しで強く主張されています。
省略できない開始タグが書かれていません。ISO/IEC 15445 などでは、<HTML> を省略することができません。XHTML1(J)では、すべての開始タグは省略できません。
ここに <TAG> が省略されているようです。省略しないようにしましょう。 **
開始タグの省略は、HTMLではあまり行なわれないようですが、仕様上は省略が許されているタグがあります。<HTML> や <HEAD>、<BODY> などの開始タグは省略することができます。だからといって、省略はしないようにしましょう。
タグのひとつもないプレーンなテキストをHTMLとして評価しようとすると、省略可能なタグが補われて、次のようなHTMLだとみなされますが、<HEAD> に必要な <TITLE> が含まれていないので、正しいHTMLとはなりません。<TITLE> タグは省略可能ではないので、自動的に補うことができません。
<HTML> <HEAD> </HEAD> <BODY> テキスト </BODY> </HTML>
こんなのは勘弁して欲しいものです。
HTML4.0で拡張されたタグのうち、古いヴァージョンとの互換のために開始タグの省略できるものがあります。例えば、HTML3.2(J)などでの次のようなTABLEがそうです。
<TABLE> <TR><TD>うはうは</TD></TR> </TABLE>
これはHTML4.01では
<TABLE> <TBODY> <TR><TD>うはうは</TD></TR> </TBODY> </TABLE>
とみなされますが、<TBODY> と </TBODY> は省略できます。この警告は減点されません。
省略可能である終了タグは、たくさんあります。HTML3.2(J)では、次の終了タグは省略して構わないことになっています。他のHTMLではまた違います。
| </HTML> | |
| </HEAD> | |
| </BODY> | |
| </PLAINTEXT> | |
| </P> | |
| o | </DT> |
| o | </DD> |
| o | </LI> |
| </TR> | |
| o | </TH> |
| o | </TD> |
| o | </OPTION> |
これらのうち、多くの場合は省略して用いられる o の付いている 6種のタグ以外の終了タグを省略したときは、この警告が出ます。これらの終了タグは、積極的に省略せよ、という意味ではなくて、省略してもいいけどほんとは書いた方がいいんだよ、というものです。
</TR> が除外されています。HTML4.01(J)に挙げられている例の多くは省略されています。これは、Mozillaなどの一部のWWWブラウザが、</TR> 省略時にテーブルの入れ子などの処理を正しく行なえないのが除外の理由です。また、Mozillaとしてチェックした場合は、</TH> と </TD> も除外されます。
また、</P> が、過去との互換のために省略できるなどというのは間違いです。過去(HTML1.0)との互換性はありません。
例えば、<DL>〜</DL> 中には <DT> と <DD> しか書けないので、
<DL> <DT>かくかくしかじか
のような場合でも、</DT> は、次の <DT> か <DD> か </DL> のいずれかの直前にあるとみなすことができます。一方、
<P>まるまるくまぐま
のようなときは、<P> の書ける場所があまり限定されていないので、</P> を、このHTMLを書いた人がどこに想定しているのかあまり明確ではありません。
<P>高名なある博士の論文に次のような記述があります。 <BLOCKQUOTE>金太郎と桃太郎は同一人物である。その根拠は…</BLOCKQUOTE> これを読んだときは目から鱗でした。</P>
これは、どう見ても <BLOCKQUOTE> が <P> の中に書けると誤解している書き方です。これは次のようにしてください。
<P>高名なある博士の論文に次のような記述があります。</P> <BLOCKQUOTE>金太郎と桃太郎は同一人物である。その根拠は…</BLOCKQUOTE> <P>これを読んだときは目から鱗でした。</P>
また、<P> を改行の意味で使用していることもあります。<P> は段落の意味のタグなので、これは好ましくありません。
〜というわけです。<P> <TABLE>〜
このようなとき、<TABLE> は <P> の中に書けないので、<TABLE> の前に </P> が省略されているとみなされ、<P> は <BR> じゃないと言われ、さらに開始タグと終了タグの間が空だと警告されます。これは次のように書きます。
<P>〜というわけです。</P> <TABLE>〜
このように、<P>〜</P> の間に書いてはならないタグを書いていることが多いので気を付けましょう。
<P align="center"><HR></P>
などというおばかなコードを吐き出すHTMLエディタもあります。これはまったく意味不明なコードです。<HR> を <P> の外に出してください。<P>〜</P> が空になったらその <P>〜</P> は捨ててください。
ここから先は私見です。
<P> はパラグラフだ。パラグラフ中に引用など別のブロックを含めることは、上の金太郎の例もそうだが、よくあるであろう。例えば、
具体的には、
1. ごじらの場合
2. もすらの場合
3. ふらんしーぬの場合
というようなケースが考えられます。
なんてのを、HTML文法に則って構造化しようとすると、<OL> を <P> に含められないので
<P>具体的には、</P> <OL> <LI>ごじらの場合 <LI>もすらの場合 <LI>ふらんしーぬの場合 </OL> <P>というようなケースが考えられます。</P>
という風に書くと思うけど、これは、どう考えてもおかしい、と感じているのは私だけではないようだ。自然な構造は、
<P>具体的には、 <OL> <LI>ごじらの場合 <LI>もすらの場合 <LI>ふらんしーぬの場合 </OL> というようなケースが考えられます。</P>
という入れ子構造だと思うが、HTMLはこれを許してくれない。
</LI> や </DT> などの省略が自明な場合に出ます。上の解説を参照してください。この警告は減点されません。
<P> を連続して
<P>ほにゃらら <P>へにょろろ
のように用いているとき、この場合「ほにゃらら」の後ろの </P> は省略が自明だとみなされます。「へにょろろ」の後ろの </P> は、さらに <P> が続けば自明な省略とみなされますが、そうでない場合は自明とはみなされません。
Laura Lemay のHTML本では </LI> は存在しないものとして解説されているけど、この本が書かれた時点のHTMLがそうだったからに過ぎず、現在のほとんどのHTMLでは </LI> は存在します。これを鵜呑みにして </LI> を存在しないものとしているおばかな参考書もあるので気を付けましょう。
ところが、残念なことにHTML4.0対応を謳ったHTML入門第2版でも「<LI> に終了タグは存在しない」と書かれているので注意してください。このシリーズ、初版から内容の全面的見直しをしてないようだ。
終了タグ </TAG> には属性を指定することはできません。 *6*
終了タグには、一切の属性を指定することはできません。
<TAG> には終了タグ </TAG> はありません。 *6*
<BR> のようなタグには終了タグ </BR> は存在しません。ただし、HTMLのヴァージョンによって、終了タグのあるものとないものがあります。例えば、HTML3.2(J)などでは <BASEFONT> に終了タグはありませんが、Mozillaの場合は </BASEFONT> が存在します。
XHTML1(J)ではすべてに終了タグが存在します。空要素タグは
<br /> <br></br>
のどちらで表記しても構いません。前者は、後者の短縮形です。空要素なので、
<br>むにゃむにゃ</br>
などと何か内容を入れることは当然できません。
<TAG>〜</TAG> 内の先頭/末尾に空白文字があります。 *
これは、次のような書き方はしないように警告します。
<A href="〜"> <IMG src="〜"> </A>
開始タグ直後と、終了タグ直前に空白や改行を入れないようにしましょう、ということです。この例だと、古い多くのWWWブラウザでホットスポットを表現する下線が、イメージの右下に髭のように表示されます。
この例は次のように書きます。
<A href="〜"><IMG src="〜"></A>
開始タグ直後の空白については、例えば <LI> 直後に入れた場合、実装によってはリストの先頭が不揃いになることがあるようです。しかし、HTML4.01(J)には空白を先行させている例が沢山載っています。
Introduction to HTML3.2(J)には、開始タグ直後の改行と、終了タグ直前の改行は無視されるようなことが書いてあります。つまり、上の <IMG> の例は等価でなければなりません。しかし、既存の多くのWWWブラウザはこれを守っていません。
HTML4.01(J)では、開始タグ直後の空白や終了タグ直前の空白は表示されると思ってはいけないようなことが書いてあります。そのとおりならば、
<P>We offer free<A href="〜"> technical support </A>for subscribers.</P>
なんて書くと、単語が繋がってしまうはずなので、こんな風に書くべきでないということになります。これは次のようにします。
<P>We offer free <A href="〜">technical support</A> for subscribers.</P>
この警告は、状況を細分して減点したりしなかったり制御すべきなのですが、そこまでできていません。つまり、インライン要素の開始タグ直後の空白のみ減点し、他は非減点にすべきであろうと考えています。とりあえず、この警告は減点されません。
</TAG> に対応する開始タグ <TAG> が見つかりません。 *6*
ほとんどの開始タグは省略できないので、それらの開始タグなしに終了タグは存在し得ません。開始タグを消したときの修正漏れの他に、タグの入れ子関係がおかしくなっているときの副作用のこともあります。
<TAGA> は NN行目の <TAGB> と重なり合っているようです。 *6*
次のように、開始タグと終了タグの関係が入り乱れているときにこの警告が出ます。
<P>むかしむかし<BIG>でかい桃が</P>どんぶらこ</BIG>
このような単純な間違いはいいのですが、タグの入れ子が深いときなど、ひとつタグを間違えただけで、この警告がたくさん出ることがあります。
入れ子にできるタグのレベルは、SGML宣言(J)の QUANTITY TAGLVL で指定されていて、たいてい 100です。
この警告に出てくる <TAG> は、そのタグでエラーが起こったことを示すだけです。<TAG> だけ 100レベルも入れ子になっているわけではありません。
NN行目の <TAG> に対応する終了タグ </TAG> が見つかりません。 *6*
省略できない終了タグを書いていないときに警告されます。よく、</A> を書いていないことがあります。WWWブラウザによっては適当に </A> を補ってそれなりのリンクが張られるものもありますが、全然うまくいかない場合もあります。この </A> を書いていないケースでは、<A> の中に <A> を書いていると警告されることも多いです。
省略できる終了タグについても目を通しておいてください。
<TAG>〜</TAG> 内に普通のテキストを書くことはできません。 *6*
<HEAD> や <UL> などの要素には、決められたタグしか書けません。
<UL>なんじゃこりゃ</UL>
みたいに書くことはできないわけです。これは、
<UL><LI>なんじゃこりゃ</UL>
が、正解です。
HTML4.01 Strictでは、<BODY>〜</BODY> 内にも普通のテキストを直接書くことはできなくなっています。つまり、
<BODY> 例えばこういう風に書く </BODY>
とは書けないのです。正しくは、次のようにします。
<BODY> <P> 例えばこういう風に書く </P> </BODY>
このように、<BODY> にはブロックレベル要素しか書けません。
<TAG> 内におかしな文字列 `XXX` があります。 *6*
タグの要素名や属性名は、(いわゆる半角の)英数字、ピリオド "."、ハイフン "-" から成り、先頭は英字です。HTML4.01(J)では、下線 "_" とコロン ":" も書けるようになっています。属性値に空白など他の文字を含めたいときなどは引用符で囲む決まりです。タグ内の引用符の外側に、これら以外の文字があったときに警告されます。よくあるのが、ハイフン "-" と下線 "_" を間違えているケースや、属性の区切りに全角空白を書いていたり、属性名を全角にしているケースです。ひとつでもこういうのがあると、そのタグ内でこのエラーがたくさん出ます。
予期しない "<" が現れたときの警告についても見てください。
XXXXXX では空要素タグを `<TAG />` と書くことはできません。 *5*
XHTML以外では、空要素タグを /> で閉じることはできません。
要素名や属性名の大文字小文字を統一するようにしましょう。 *
タグの要素名や属性名の大文字小文字は同一視されるので、次はすべて同じです(XHTMLを除く)。
<BLOCKQUOTE> <BlockQuote> <blockquote>
HTML中でこれらを大文字か小文字かどちらかに統一して書いていた方が美しかろう、という(多分に宗教臭い)警告です。要素名、属性名それぞれ独立にチェックされます。HTML4.01(J)のリファレンスでは、要素名は大文字、属性名は小文字で書かれていて、その理由は読み易くするためだ、と言ってます。
この警告は、Weblintを引き継いだだけの警告で、減点されません。
XML(J)では要素名や属性名の大文字小文字は区別されるので、どれでもいいというわけにはいきません。決められているとおりに大文字小文字のメリハリを付けて書く必要があります。XHTML1(J)では、要素名、属性名は小文字に決められているので小文字で書かなければなりません。
<TAG> に不明な属性 `ATTR` が指定されています。 *5*
間違った属性が指定されています。スペルミスなどの可能性があります。しかし、参考書があからさまに間違った解説をしていないとも限りません。例えば、Mozillaを解説したある参考書では、<LAYER> に名前を付けるのにNAME属性を使うよう指導しています。Netscape社のサイトを見ればわかりますが、これはID属性の誤りです。
<TAG> に XXXX 用の属性 `ATTR` が指定されています。 *5*
チェックしているHTMLのヴァージョンではサポートされていないが、他のヴァージョンでサポートされている属性です。あまりこの警告が大量に出るようなら、DOCTYPE宣言が適切でない可能性があります。
<TAG> の属性 `ATTR` はあまり薦められない属性です。 *3*
この属性は、すたれつつある属性です。将来はサポートされなくなる可能性があるので、使わないようにしましょう。ここで指摘される属性には、スタイルシートによる代替はありません。特に<A>のTARGET属性は、その利用自体が薦められていません。フレームの利用や、強制的な方向付けはやめましょう。
XHTML1.0(J)では、<A>などのNAME属性は薦められていません。ID属性を使いましょう。XHTML1.1では、そのようなNAME属性は廃止されています。
<TAG> の属性 `ATTR` はあまり薦められない属性です。スタイルシートを使いましょう。 *3*
スタイルシート(CSS1(J)/CSS2(J))での代替を薦められている属性です。残念ながら、これらの属性すべてがスタイルシートで置き換え可能なわけではありません(CSS2では可能?)し、スタイルシートをサポートしていないWWWブラウザのためには使わざるを得ないとも思います。この警告は減点されません。
<TAG> の属性 `ATTR` は Another HTML-lint では正確な評価はできません。
MSIE5.0でサポートされている <HTML xmlns:namespace> を正確に解釈することはできません。
xmlns:namespace は、指定された namespace を <STYLE>〜</STYLE> 内で定義し、<namespace:xxx>〜</namespace:xxx> のように参照します。この警告は減点されません。
<TAG> の ATTR 属性の前には空白が必要です。 *6* または **
属性の指定を
<BODY bgcolor="#FF00FF"link="#808080">
のように続けて書いているときに警告されます。この例では link の前に空白がありません。
HTMLでは、なくても文法上エラーではありませんが、XHTMLでは文法違反です。
<TAG> で ATTR 属性の指定が繰り返されています。 *5*
タグで指定する属性は、同じものを何度も指定することはできません。
<BODY bgcolor="#FF00FF" bgcolor="#808080">
なんてのはだめです。
タグによっては、必ず指定しなければならない属性のあるものがあります。HTML3.2(J)の <BASE> のHREF属性などがそうです。また、<AREA> のALT属性は必須です。<IMG> のALT属性はHTML3.2では必須ではないのですが、HTML4.01では必要な属性となっています。ALT属性の使用を促す警告も見てください。
<TAG> で ATTRA 属性を使うときは ATTRB 属性も必要です。 *3*
NTT DoCoMo iモードでは、同時に指定しなければならない属性があります。
<A IJAM HREF>
<A TELBOOK KANA EMAIL HREF>
<TAG> で ATTRA 属性と ATTRB 属性を同時に指定することはできません。 *3*
NTT DoCoMo iモード 4.0では、同時に指定してはならない属性があります。
<A IJAM>
<A ISTA>
<TAG> の ATTR 属性には属性値が必要です。 *5*
多くの属性は属性値を伴って指定されます。
<BR clear>
では不完全です。
<BR clear="all">
のように属性値を正しく指定しましょう。
<BR clear=>
なんて書いたときは別の警告が出ます。
<TAG> の ATTR の属性値が指定されていません。 *6*
属性値が = の後ろに指定されていません。
<A name=>
のように書いてしまったときにこの警告が出ます。
<TAG> の ATTR の属性値が複数行に渡っています。 *
引用符で囲んだ属性値は、行をまたいで書いても構いません。改行はただの空白と同じ扱いです。
<AREA shape="rect" coords="10, 12,
50, 76">
とかいう具合なんですが、まあ、一応警告しときます。この警告は減点されません。
<TAG> の ATTR の属性値区切りの = 前後に空白が含まれています。 *
RFC1866(J)では、属性と属性値とを区切る = の前後には空白を含めてもいいことになってるんですが、それをわざわざ警告するHTMLチェッカも存在するのでこの警告があります。この警告は減点されません。
<TAG> の ATTR の属性値の引用符が閉じられていません。 *3*
属性値を引用符で囲んでいる場合、その中に ">" が現れると、タグが閉じられてしまう可能性があります。
<IMG src="〜" alt="a>b">
のようなのは、
<IMG src="〜" alt="a>b">
と、実体参照を用いて書くようにしましょう。これについては、RFC1866(J)で言及されていて、本来は間違いとは言えないのですが、実際に引用符を閉じ忘れている場合との区別が厳密にはつかないため、Another HTML-lint では文法的な間違いとしています。
<TAG> の ATTR の属性値が 'XXXX' と書かれていますが、"XXXX" の方が安全です。 *
属性値の文字列を囲む引用符には、二重引用符 "〜" と単引用符 '〜' のどちらでも使用できます。これらの使い分けは、主に二重引用符自身を表現したいときに、いちいち " と書くのがわずわしいので単引用符で囲む、というものです。
"We say "So!"" 'We say "So!"'
これらは、どちらも同じです。しかし、単引用符を解釈しないWWWブラウザが存在するそうです(MSIE for MacOS が該当します)。この警告は減点されません。
ところで、ある参考書に "〜" 中に " を書くには \" とするなどと書いたのがありました。どうしてそんな解説が書けるのか不思議でなりません。JavaScript中などとごっちゃになってるんですかね。
<TAG> の ATTR の属性値 `XXXX` は引用符で囲まなければなりません。 *6*
属性値を必ずしも引用符で囲む必要はありません(XHTMLを除く)。値が英数字、ピリオド "."、ハイフン "-" から成り(いずれも半角の)、72文字以内の文字列のときは引用符で囲む必要はありません(実際はこれらの制限はSGML宣言(J)の QUANTITY NAMELEN で行われて、HTML4.01では 65536です)。そうでない文字列は、引用符で囲まなければなりません。-5 は囲まなくてもいいですが、+5 は囲まなければなりません。Cプログラマの方は、下線 "_" が含まれていないことに注意してください。
<A href="〜" target=_top>
は
<A href="〜" target="_top">
と書かなければなりません。ただし、HTML4.01(J)では、名前文字に下線 "_" とコロン ":" が追加されているので、_top を引用符で囲む必要はないのですが、他のHTMLのことも考えれば囲んだ方が安全です。
Laura Lemay の続HTML入門に、<FONT SIZE=+5> とか <HR WIDTH=90%> とかいう例が載っているけど、これらは間違いです。
<TAG> の ATTR の属性値 `XXXX` は引用符で囲んだ方が安全です。 **
HTML4.01(J)で、下線 "_" やコロン ":" を含む文字列を引用符で囲んでいないときにこの警告が出ます。他のHTMLのことも考えれば囲んだ方が安全です。
<TAG> の ATTR の属性値 `XXXX` が引用符で囲まれていません。 *
引用符で囲む必要のない裸で指定されている属性値に対して、注意を促します。これは、好みで全部囲まなきゃ気が済まないときなどにチェックするようにしましょう。それ以外ではたぶん不要です。この警告は減点されません。
<TAG> の ATTR の属性値 `XXXX` は空白文字が先行または後行しています。 *
決まった値や数値などを取る属性の値に空白を先行、後行させたときに出ます。
<P align=" center"> <UL type="disk "> <LI value=" 5 ">
これらが間違いかどうかはよく知らないのですが、文書記述言語SGML(内容は日本工業規格だからそれなりだけど、HTMLとしては無惨極まりない)の 6. 要素構造 によると、正しくないように読めます。
XHTML1(J)には、属性値の先行後行する空白は無視され、それ以外の連続する空白は単一の空白として扱われると書かれています。つまり、上の例はすべて正当です。
<TAG> の ATTR の属性値 `XXXX` はあまり薦められない値です。 *3*
この値は、すたれつつある値です。将来は指定できなくなる可能性があるので、使わないようにしましょう。
<TAG> の ATTR の属性値に空の値を指定することはできません。 *5*
決まった値や数値などを取る属性は、値に空を指定することはできません。このような属性は多数あります。
<P align=""> <UL type=""> <LI value="">
これらはいずれも正しくありません。<IMG alt=""> のように、空にできる属性もあります。
<IMG src=""> のようにURIを空にした場合は違う警告が出ます。
<TAG> の ATTR の属性値が NN文字を超えています。 *5*
HTMLにおける属性値は 1024文字以内でなければなりません。これは、SGML宣言(J)の QUANTITY LITLEN で指定されるもので、HTMLごとに違っているのですが、1024に決め撃ちです。ちなみにHTML4.01では 65536です。
NTT DoCoMo iモードでは、次のような文字数の制限があります。
<OPTION VALUE> の文字数は 10文字以内。2.0では42文字以内、3.0では制限なし。
<A CTI> の文字数は 128文字以内。
<A SUBJECT> の文字数は 30文字以内。
<A BODY> の文字数は 500文字以内。
<A TELBOOK> の文字数は 20文字以内。
<A KANA> の文字数は 18文字以内。
<A EMAIL> の文字数は 50文字以内。
いずれも半角での文字数で、全角は半角2文字に勘定しています。
<TAG> の ATTR の属性値 `XXXX` は正しくありません。 *5*
属性値として、取り得る値が決められているものが多くあります。例えば <DIV ALIGN> には LEFT、CENTER、RIGHT のいずれか、<BR CLEAR> には ALL、LEFT、RIGHT、NONE のいずれかしか書けないなどです。
<TAG> の ATTR の属性値 `XXXX` は正しくありません。#RRGGBB の形式か決められた色の名前でなければなりません。 *5*
BGCOLORなどの色の指定は、"#00FF80" のような特別な形式でRGBを指定するか、決められている色の名前を指定します。HTML3.2(J)やHTML4.01(J)では 16色に名前が付けられていますが、MozillaやMSIEでは拡張されていて全部で 140色に名前が付いています。
<HEAD> の PROFILE の属性値は、DTD上は単一のURIとされています。 **
HEADのPROFILE属性は、DTD上はHTML4〜XHTML1.1まで皆単一のURIと定義されています。
<!ATTLIST HEAD %i18n; -- lang, dir -- profile %URI; #IMPLIED -- named dictionary of meta info -- >
しかし、例えば HTML4.01(J) では、次のように述べられていて矛盾しています。
- profile = uri [CT]
- This attribute specifies the location of one or more meta data profiles, separated by white space. For future extensions, user agents should consider the value to be a list even though this specification only considers the first URI to be significant. Profiles are discussed below in the section on meta data.
Another HTML-lint は、PROFILE属性を空白区切りの複数のURI列として評価します。この警告は減点されません。
<TAG> の ATTR の属性値 `XXXX` は使わない方が安全です。 *3*
XHTMLのID属性の値は、HTMLのそれとは異なっており、互換性もありません。下線 "_" から始まるID値は、XHTMLで使えますが、HTMLでは使えません。そのような値は避けるようにしましょう。
<TAG> の ATTR の属性値 `XXXX` は `xxxx` でなければなりません。 *5*
XHTMLでは、属性値の大文字小文字は区別されます。
<TAG> の ATTR の属性値は `XXXX` でなければなりません。 *5*
ごく一部の属性は、取り得る値が固定されているものがあります(DTDで#FIXEDが指定されているもの)。そのような属性では、固定されている値以外を指定することはできません。
<TAG> の ATTR は属性名と属性値が同一です。属性名を省略して属性値だけの指定にしましょう。 **
例えば、
<DL compact>
というのは、
<DL compact=compact>
の属性名の compact= の部分を省略した書き方です(属性値を省略しているのではありません)。したがって、本来ならばこのような省略しない書き方もできるはずなのですが、こういうのを解釈しないWWWブラウザもあるようです。省略した書き方をするようにしましょう。
<TAG> の属性 `ATTR` で属性名を省略することはできません。 *5*
属性値の引用符を省略できないXHTML1(J)では、属性名を省略した短縮形を書くことはできません。例えば、
<dl compact>
というのは、
<dl compact="compact">
と書かなければなりません。
<TAG> の `XXXX` は属性名 ATTR が省略されていますが、うまく評価されないかも知れません。 **
属性名の省略は、何も compact=compact のような場合だけではなく、
<P center>
のように書いてもいいことになっています(XHTML1を除く)。これは、
<P align="center">
の省略形です。こういうのは、他に center という値を取る属性が存在しないときに可能なのですが、ここまで省略形をきちんと解釈してくれるWWWブラウザはなかなかないようです。
HTML4.01で <TABLE border> という風に書くと、これは、<TABLE frame=border> と解釈されるので注意してください。
実体参照 `&xx` の後ろには `;` を書きましょう。 *3*
実体参照というのは、< や & みたいな書き方のこと(正確には後者は文字参照)で、テキスト中に "<" や ">" など直接表現できない文字を書くときの方便です。実体参照は "&" で始まって ";" で終わります。SGMLでは、終わりのセミコロンは、省略が自明な場合は書かなくてもいいことになっています。例えば、
abc < xyz
実体参照 `'` は `'` と書くようにしましょう。 *3*
XHTML 1.0 (Second Edition) の C.16 に、後方互換性のために、' は使わないで ' と書くようにとされています。
XHTML では 16進数の文字参照は `ሴ` と小文字で始めなければなりません。 *3*
大文字小文字の区別されるXHTMLでは、16進数の文字参照も &#x と小文字で始めなければなりません。ሴ は誤りです。
"<" や ">" など実体参照で参照される名前は、HTMLごとに決まっています。大文字小文字が区別されるので、"&" のつもりで "&" と書くことはできません。WWWブラウザによっては同一視しているものもあるようですが、本来は間違いです。また、
abc<xyz
という風にしてしまうと、"<xyz" が実体参照だとみなされてしまいます。
CGI呼び出しでのパラメタ区切りは歴史的に & です。この & も & と書かなければならないことに注意してください。
<A href="uso.cgi?foo=1&bar=2">
ではだめです。
<A href="uso.cgi?foo=1&bar=2">
としなければなりません。& のままで動作するのは偶然です。上の例では、たまたま &bar という実体が定義されていないからに過ぎません。
<A href="uso.cgi?lt=1>=2">
では、
<A href="uso.cgi?lt=1>=2">
と解釈されてしまいます。
CGI呼び出し中でも実体参照を用いなければならないことは、RFC1866(J) 8.2.1 や、HTML4.01(J)などに書かれています。これにからんで、パラメタ区切りは "&" じゃなくて ";" にしましょうとも書かれていますが実際そうなりつつあるんでしょうか。少なくとも、Perlの非標準のライブラリ cgi-lib.pl や、標準の CGI.pm は、比較的新しい版ならどちらの区切りでも受け付けてくれます。
プロバイダ指定のCGIを利用する場合、この "&" を実体参照で解説しているものはまずありません。言われたとおりに書かなけりゃ動かないと脅されていると思いますが、"&" と書き直してみてください。動くはずです。これは、CGI側の制約ではなくWWWブラウザ側の問題だからです。ちなみに、古いOmniWeb1.0ではURL中の実体参照が展開されないそうです。
文字参照 `&#NNN;` は限界を超えた文字コードです。参照できるのは `&#MMM;` までです。 *6*
&