XHTML文書を公開する際にユーザエージェントの実装状況から気をつけなければならない事を覚書として纏めておきました。
正直、XHTML文書の配信には充分な注意が必要かと思われます。
このため、全面的に書き直す事としました。(平成19年 8月26日)
XHTML文書のMIMEタイプ (平成19年 8月30日 訂正)
<meta http-equiv="…">要素も使えません (平成19年 8月30日)XHTMLはXMLの応用言語であり、SGMLの応用言語である在来HTMLとは別物です。
現行のXHTMLは利用出来る要素・属性とも在来HTMLと殆ど変わりませんが、だからと言って在来HTMLの代わりに利用する事は好ましくない事とされております。
このため、理念としてはXHTML文書は在来HTML文書とは別物として配信する必要があります。
XHTMLはXMLの応用言語ですので、当然XMLの文法に従っている(整形式である)必要があります。
その一方で、文書型宣言を持つXHTMLでマークアップした場合、文書型宣言で指定したDTDに従っている事(妥当である事)も必要です。
しかし、現状では殆どのウェブブラウザはXHTML文書の妥当性を検証しません。
通常、妥当かどうかは整形式かどうかより厳しいとされております。
このため、
…と思われがちですが、実際にはそうは行かないのです。
妥当性を検証しないウェブブラウザは当然DTDを見る事はありません。
一方、XHTMLなどXML応用言語一般に於いて、XMLの仕様で定義されていない文字実体参照は全て実体宣言で定義され、これらはDTD内に記述されております。
>(>), <(<), &(&), "("), 及び'(')の五つしかありません。と言う事は、妥当性を検証しないブラウザでこれら以外の文字実体参照が使われているXHTML文書を読み込むと、不正な実体参照が使われていると見なされてしまい、結果致命的エラーが生じてしまいます。
つまり、妥当なら整形式と言う論法自体が間違っていると言う訳です。
©(©)などが定義されていて、これらはエラーにならない場合があります。しかし、このような"独自拡張"は全てのブラウザで期待しても良いものではありません。対策としては、XMLの仕様で定められている文字実体参照以外は一切使わず、数値文字参照で代用する事です。
数値文字参照なら、DTDを読まない場合であっても不正な実体参照と見なさず、結果エラーとはならなくなります。
XHTMLでマークアップされた文書のMIMEタイプは、application/xhtml+xml が最も適切とされております。
application/vnd.wap.xhtml+xml を使う事を推奨しております。一方、在来HTMLでマークアップされたHTML文書は、必ず text/html をMIMEタイプとして配信しなければなりません。
XHTML 1.0を在来HTMLの代わりに利用する場合も text/html をMIMEタイプとする必要があります事が出来ますが、この場合でもapplication/xhtml+xml の方が望ましいとされております。
XHTML文書のためのMIMEタイプとして application/xhtml+xml が定義されているのはいくつかの理由があります。
実際、XHTML 1.1に MathML(数式を記述するためのXML応用言語)やSVG(ヴェクタグラフィックを記述するXML応用言語)を組み合わせたDTDなどが公開されております。
このように複数応用言語に対応する事は、在来HTML文書と同じ扱いでは出来ない事です。
非公式な独自の要素を定め、それをXSLスタイルシートでXHTMLや在来HTMLに変換して取扱うと言う事も考えられます。
XMLに対応した現行のクライアントなら、後述の<?xml-stylesheet?>処理命令でXSLスタイルシートのリンクを指定すればクライアント側がXSLTを利用して文書を閲覧出来るでしょう。
しかし、XSLスタイルシートはXML応用言語の一つですので、やはり在来HTML文書扱いとした場合には利用出来なくなります。
一般のXML文書に対しては text/xml、一般のXMLアプリケーションに対しては application/xml と言うMIMEタイプが定義されております。
しかし、XHTMLには<a>要素のhref属性など、特定の要素属性に固有の機能が与えられております。
このため、一般のXMLとして取扱おうとすると、これらの独自の要素属性が機能しなくなる恐れがあります。
xmlns="http://www.w3.org/1999/xhtml"属性を与える)事で正しく認識される事はありますが、そうなっていないウェブブラウザもあります。結局、XHTML文書に対しては特殊なXMLアプリケーションとして独自のMIMEタイプを定める必要があったのです。
application/xhtml+xmlの実装上の問題。しかし、実際にはXHTML文書のためのMIMEタイプとされている application/xhtml+xml について以下のような問題があります。
インターネットエクスプローラは現行の7.0になっても未だに application/xhtml+xmlを認識しません。
application/xhtml+xml をMIMEタイプとするコンテンツを受け取ると、意味不明のコンテンツと見なしてローカル保存を行おうとします。
application/xhtml+xml をMIMEタイプとして配信しようと言う動きがありました。当然、絶対にやってはいけない行為です。勿論、通常のXMLアプリケーションとして扱う事は不可能ではありませんが、ヴァージョンに依っては正常に取扱う事は出来ません。
また、<?xml-stylesheet?>処理命令にも不具合があります。
オペラ 6.0ではMIMEタイプに application/xhtml+xml が与えられると、<link>要素でのスタイルシートへのリンクが機能しなくなります。
しかも、<?xml-stylesheet?>処理命令にも不具合があります。
ウィンドウズ版のサファリ 3.0ではMIMEタイプに application/xhtml+xml が与えられると、JAVAスクリプトでのDOMが機能しなくなります。
また、<?xml-stylesheet?>処理命令に不具合があります。
ネットスケープ 4.x 以前は、XML自体認識しないため、MIMEタイプに application/xhtml+xml が与えられると意味不明のファイルと見なしてローカル保存を行おうとします。
以上のように、多くのウェブブラウザで application/xhtml+xml 型には問題がある事が分かります。
結局、MIMEタイプに application/xhtml+xml を与えても問題が起こらないのは
くらいとなってしまいます。
<meta http-equiv="…">要素も使えません。(平成19年 8月30日)application/xhtml+xml 型に於いては、<meta>要素にhttp-equiv属性を付けるのは好ましくありません。
なぜなら、一般のXMLパーサにはHTTPで文書を取得した際に受け取った応答ヘッダを読込時に修正する機能は想定されていないからです。
完全には禁止しておりませんが、これらの要素での応答ヘッダ修正は機能しない恐れがある事は知っておいた方が良いでしょう。
<meta http-equiv="refresh">要素でのリフレッシュなどは無効になる事が予想されます。つまり、何時まで経ってもリフレッシュしない場合があります(<meta http-equiv="refresh">要素でのリフレッシュ自体が排除すべきものですが)。<meta http-equiv="…">要素をコメントアウトするか、外しております。但し、text/html 型で配信する場合には<meta http-equiv="content-type">要素での文字コード指定も併用する事が望ましいとされております。
text/html 型とした場合には<?xml?>宣言が認識されない事があるからです。XHTMLはHTMLをXML上で再定義したものですので、当然<link>要素でスタイルシートをリンク出来ます。
一方、XMLでは共通のスタイルシートリンク機構として<?xml-stylesheet?>処理命令が用意されております。
現状、XHTML文書ではどちらの方法でもスタイルシートをリンク出来ますが、XML応用言語である事を考えるとやはり<?xml-stylesheet?>処理命令が望ましいと思われます。
<?xml-stylesheet?>処理命令はXML共通のスタイルシートリンク機構として策定されたもので、以下の書式に従います。
<?xml-stylesheet type="スタイルシート言語のタイプ" href="スタイルシートへのURI" media="対応するメディア型" alternate="代替スタイルシートとすべきか" title="スタイルシート名"?>
ご覧の通り、alternate擬似属性以外は<link>要素と殆ど同じです。
alternate擬似属性は
alternate="yes" 属性alternate="no" 属性(デフォルト)をそれぞれ与えます。
尚、<?xml-stylesheet?>処理命令は通常<?xml?>宣言の直後、文書型宣言(文書型宣言が無い場合にはルート要素開始タグ)の直前に記述します。
<?xml-stylesheet?>処理命令には以下のブラウザでバグが見られます。
いずれも、media擬似属性を認識しません。
この結果、複数メディアのスタイルシートを<?xml-stylesheet?>処理命令を並べて記述した場合、無視されるべきスタイルシートまでリンクしてしまい、スタイル定義がごちゃ混ぜになってしまう事があります。
以下の例で言えば、PC上のインターネットエクスプローラ, オペラ 6.0またはサファリで当該XHTML文書を開いた場合、携帯電話向けのスタイルシートである css-mobi.css も一緒に取り込んでしまい、このスタイルシートの内容で一部セレクタの一部プロパティが上書きされてしまうかも知れません。
<?xml version="1.0" encoding="shift_jis"?><?xml-stylesheet type="text/css" href="css-PC.css" media="screen, projection"?><?xml-stylesheet type="text/css" href="css-mobi.css" media="handheld"?>
XHTML文書(MIMEタイプとして application/xhtml+xml などが与えられている文書)では、JAVAスクリプトについて以下の点に注意しなければなりません。
XHTML文書ではdocument.write()メソッドで文書中にHTMLを書き加える事が出来ません。
このため、XHTML文書でスクリプトに依り文書を書き加えたい場合にはDOMを利用する必要があります。
しかし、オペラ 6.0ではDOMでのHTML追加に便利なinnerHTMLプロパティが実装されておりません。
また、innerHTMLプロパティを用いてHTMLを付け足したり書き直したりする場合、そのHTMLもまた整形式となっている必要があります。
そうでないと、スクリプトの処理中にパースエラーが発生するからです。
また、ウィンドウズ版サファリ 3.0では application/xhtml+xml 型のXHTML文書ではDOMが機能しません。
XHTML文書のMIMEタイプ・application/xhtml+xmlの実装上の問題でも書いた通り、XHTML文書をXHTML文書として配信する、すなわちXHTMLでマークアップされた文書を application/xhtml+xml と言うMIMEタイプで配信するのは、まだ実装上問題が残っております。
現状、もじら系ブラウザとオペラ 7.0以降くらいしか完全に取扱えるウェブブラウザがありません。
特に他のXML応用言語と組み合わせるとか、Another HTML-lintで減点されたくないと言うのでも無い限り、大人しく text/html 型で配信した方が良いのかも知れません。
勿論、無理してXHTMLを使わずに大人しくHTML 4.01などの在来HTMLか、或いは在来HTML扱いが許されているXHTML 1.0でマークアップするのが一番良い方法なのは言うまでもありません。
application/xhtml+xml 型で配信し、その他のブラウザには HTML 4.01 トランジッショナルに変換して text/html 型で配信するようにしております。特に XML世代より前の環境には在来HTMLに変換して配信するようにしております。application/xhtml+xml 型にしろと言うのは絵に書いた餅を無理矢理喰わせる行為にしか見えません。独善的に現実を無視してドン・キホーテでも気取るか、現状を認識して適切に対応するかでしょう。