XML空要素タグのHTML的解釈

securecatのMTの簡略終了タグで閉じるscript要素があると、IEは表示できないに書かれていた、WinIE避けの方法について。

<link rel="stylesheet" href="default.css" />
<script />
<link rel="stylesheet" href="withoutWinIE.css" />
<script></script>

上記のマークアップがHTMLとして解析された場合、最初のscriptタグは空要素ではなく単なる開始タグと扱われるので、script要素の内容に後のlinkタグを含むことになります。が、HTML 4.01ではscript要素の内容はCDATAであるため、HTML 4.01を正しく解釈するブラウザでは後のlinkタグを単なる文字列として扱い、要素としては見なされなくなります。つまりWinIEだけでなく、正しくHTMLを解釈するブラウザ全てを避けることになりそうです。

CDATAの説明については以下を参照。

Firefoxで確認しても、text/htmlの場合には後者のlinkタグを無視しました(application/xhtml+xmlではlink要素として認識しました)。

* * *

簡略終了タグ使って閉じちゃったというscript要素があると、WinIE6はその記述以降を表示できません。

と書かれているのが気になる点で、WinIE6が表示できないのではなく、HTMLの妥当な解釈として、scriptタグ以降をscript要素の内容とするために表示できない、ということではないでしょうか。

<script />
<p>display?</p>

というマークアップについて、Firefoxがp要素を表示するのは、あくまでエラー処理としてscript要素をp要素の前で終了させているからで、scriptタグが"/>"で閉じられているかどうかにはよらないようです。実際、

<script>
<p>display?</p>

というマークアップでもFirefoxはp要素を表示します(text/htmlの場合)。また、

<script />
<p>display?</p>
</script>

というマークアップ(妥当ではありませんが)については、scriptの終了タグがちゃんとあるため、<p>display?</p> という文字列はscript要素の内容と解釈され、Firefoxでは表示されません(text/htmlの場合)。

* * *

XMLの空要素タグ(<empty/>)が空要素タグとして扱われるのは、文書がXMLとして提供された場合であり、HTMLとして提供された場合では単なる開始タグとしてしか扱われないものと考えるべきでしょう。だからこそXHTML 1.0のHTML互換性ガイドラインでは

ということを薦めているのだと思います。

付記に続きます。