XHTML1.1の変更点
Updated / Published
XHTML1.1 と XHTML1.0 の違い、XHTML1.0 から移行する際の注意点や推奨MIME(application/xhtml+xml
)への対処法。
XHTML1.0 と XHTML1.1 の違い
XHTML1.1 は XHTML1.0厳密型(Strict バリエーション)DTDをモジュール化(Modularization of XHTML)により再形式化したものです。
モジュール化とは、要素や属性の定義を、構造モジュール(html
, head
, title
, body
)、リストモジュール(ul
, ol
, li
, dl
, dt
, dd
)、テーブルモジュール(table
, th
, tr
, td
, caption
, col
, colgroup
, tbody
, thead
, tfoot
)のように、それぞれ機能別にいくつかのモジュールに分割し、PCブラウザだけでなくモバイル・デバイス(携帯電話など)、テレビ(テレビベースのウェブブラウザ)など多種多様な UA が利用することを想定して、一部のモジュールのみをサポートできるように、または独自に定義したモジュールを組み合わせたり、必要な機能だけを選択することができる設計になっています。
これにより開発ベンダーであれば自社製品の使用用途に応じた必要限の機能のみの実装を行ったり、ユーザ側では必要に応じて機能を追加したりなどの使い方ができるようになることが想定されます。用途次第では、最低限の基盤となるコアモジュールである Structure(構造)モジュール, Text(テキスト)モジュール, HyperText(ハイパーテキスト)モジュール, List(リスト)モジュールのみを実装したデバイスなどが今後出てくることがあったりするのかもしれません。
記述における変更としては、XHTML1.0 は HTML4 を XML を応用して再形式化したものであり、さらに XHTML1.0 を再形式化した XHTML1.1 においても、HTML4.01厳密型DTD から何ら意味的にほとんど修正はなく、XHTML1.0 Strict から XHTML1.1 におけるおさえてくべき主な変更点は以下の3つぐらいです。
lang
属性が廃止され、代わりにxml:lang
属性に統一された。a
要素とmap
要素からもname
属性が廃止されid
属性の指定のみに統一された。- 振り仮名を処理するルビ関連の要素が新しく追加された。
以下、ここからはXHTML1.0 から XHTML1.1 へ移行する際の注意点や対処法について解説します。
DOCTYPE宣言(文書型宣言)
XHTML1.1 は XHTML1.0厳密型DTD をモジュール化により再形式化したものであり、HTML4.01 や XHTML1.0 にあった厳密型(Strict), 移行型(Transitional), フレーム設定型(Frameset)のようなカテゴリ分け(バリエーション)はありません。つまり、W3C の仕様において「推奨しない」とされる要素や属性、さらにフレーム機能用の内容は一切使えなくなります。XML宣言に続いて XHTML1.1 用の文書型定義(DTD)を宣言します。
XHTML1.1 DTD
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
xmlns属性と xml:lang属性の指定
XHTML1.0 からの変更点は lang
属性の廃止です。XHTML1.0 では lang
属性と xml:lang
属性の両方を同じ値で指定するように定義されていましたが、XHTML1.1 では lang
属性は廃止され、代わりに xml:lang
属性のみを指定します。当該文書のデフォルト言語の設定においても html
要素に xmlns
属性の XMLネームスペース(名前空間)の指定に続いて xml:lang
属性のみで指定します。
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
HTTPレスポンスヘッダで文書のMIMEを設定する
W3C XHTML Media Types によると、XHTML文書の MIMEは "application/xhtml+xml
" が最も適切であり、次に適切なのが "application/xml
"、または "text/xml
" であると定義されています。従来の HTML や XHTML1.0 では head
要素内にUAにとってHTTPレスポンスヘッダと同様の働きをする補足情報(メタ情報)として機能するmeta http-equiv
宣言で文書のMIMEを指定することができましたが、XHTML1.1 では、meta http-equiv
宣言をすること自体が非推奨となっています。
つまり、meta http-equiv
宣言を使わずに、XHTML文書の MIMEを設定するには、サーバ設定ファイルでHTTPレスポンスヘッダ内に直接MIMEを指定する必要があります。サーバ設定ファイルとは、UNIX系OSの多くが採用しているApacheウェブサーバであればhttpd.confや.htaccess、WindowsのIISであればWeb.configなどのファイルを使って設定することができます。
しかし、古いUAにはHTTPレスポンスヘッダに"application/xhtml+xml
" のMIMEを設定した文書を読み込むことができないという大きな問題があります。これは、Internet Explorer9からは"application/xhtml+xml
"のXHTML文書を読み込むことができるのですが、未だ大きなブラウザシェア率を占めている Internet Explorer6, 7, 8 では、"application/xhtml+xml
"のXHTML文書をダウンロードファイルとして扱うことになります。
そこで、これらInternet Explorer6, 7, 8 の問題を考慮して、次に望ましいとされる "application/xml
" と "text/xml
" をHTTPレスポンスヘッダに設定してみるも、またもエラーがでてXHTML文書として正しく処理することができません。これは Internet Explorer6, 7, 8 が Webコンテンツとしてアクセスできる XHTML文書のMIMEが、"text/html
" でなければならいといった致命的な実装が原因となっているためです。
つまり、仕様に準拠した MIMEを設定すると Internet Explorer6, 7, 8では、XHTML文書を観覧することすら適いません。そのため、HTML互換用に "text/html
" のMIMEを設定することで、実装に問題のある Internet Explorer6, 7, 8 においても問題なく観覧することは可能です。
ここまでのHTTPレスポンスヘッダの設定をまとめると、"text/html
" のMIMEで HTTPレスポンスヘッダを設定し、meta http-equiv
宣言が指定できないため同時に文字コードも指定します(ここでは仮に XHTML文書の拡張子を "html
" または "htm
" として、記述されている文字コードを "UTF-8
" とします。たとえば、Apacheウェブサーバであれば、.htaccess ファイルには次のように記述します。
AddType "text/html; charset=UTF-8" html htm
現状のユーザの観覧環境を配慮するとなると、HTTPレスポンスヘッダに "text/html
" のMIMEを設定するのは仕様がないのですが、当然のことながら、これはXHTML文書を HTML文書として読み込ませているだけなので、XHTML文書としての意味はありません。ただ単に、XMLベースのマークアップをしただけで、従来通りのHTML文書と変わりはありません。しかし、現実的な XHTML文書のためには、XHTML文書を読み取る UA を考慮して、HTML文書として読み込ませなければならない状況にあり、仕様においても XHTML文書の MIMEに "text/html
" を指定することは非推奨(Should not)とあるだけで、禁止(Must not)とはされていないので、現状の UA の対応状況を考慮したXHTML文書のMIME設定は以上のようにまとめることができると考えられます。そのため現状では XHTML文書に XHTML1.1 の規格を採用しないのが一般的です。
HTTPレスポンスヘッダに設定すべき推奨MIME
HTML4.01, XHTML1.0, XHTML1.1 の各バージョンにおける推奨MIMEをまとめておくので確認してください。XHTML1.0では、HTML互換と非互換の2タイプをとることができます。
MIME | HTML4.01 | XHTML1.0(互換) | XHTML1.0(非互換) | XHTML1.1 |
---|---|---|---|---|
text/html | 推奨(Should) | 可能(May) | 非推奨(Should not) | 非推奨(Should not) |
application/xhtml+xml | 禁止(Must not) | 推奨(Should) | 推奨(Should) | 推奨(Should) |
application/xml, text/xml | 禁止(Must not) | 可能(May) | 可能(May) | 可能(May) |
結局のところ、現状での UA の対応状況を考慮するとなると、XHTML文書は HTML互換の XHTML1.0 の規格を採用するのが妥当ということに落ち着きます。ただし、古いUA の対応を必要としないのであれば、HTML非互換の XHTML1.0、または XHTML1.1 の規格を採用すべきです。
name属性の廃止と id属性への統一
XHTML1.0の場合: <a id="top" name="top">
XHTML1.1の場合: <a id="top">
HTML では要素の識別子として name
属性、または id
属性を指定できました。続いて、XHTML1.0 では id
属性を参照できない UA との後方互換のために a
要素, applet
要素, frame
要素, form
要素, iframe
要素, img
要素, map
要素については name
属性と id
属性の両方を同じ値で指定することが認められていました(XHTML1.0厳密型DTD では a
要素と map
要素の2つにしか認められていません)。
しかし、XHTML1.1 では name
属性は完全に廃止されたため、要素の識別子には name
属性に代わって id
属性のみを指定します。name
属性の指定は a
要素, applet
要素, frame
要素, form
要素, iframe
要素, img
要素, map
要素に限定されていましたが、id
属性はほぼすべての要素(base
要素, head
要素, html
要素, meta
要素, script
要素, style
要素, title
要素を除く)に指定するこができます。a
要素に name
属性を指定して使っていた目的地アンカー(終点アンカー)も、他の要素に id
属性を指定することで代替が可能です。id
属性の目的地アンカーには Internet Explorer 4, Netscape 6 より対応しています。
ルビ関連の機能の追加
XHTML1.1 では、文書中に新たに追加されたルビ関連のマークアップを施すことでルビを作成することができます。ルビは、主に読みがな (発音ガイド) をつけるために使われ、ベーステキストとルビテキストから構成されます。 ルビを振る対象となる本文部分がベーステキストと呼ばれ、読みがなの部分がルビテキストと呼ばれます。
ルビを作成するための基本形は、"<ruby><rb>ベーステキスト</rb><rt>ルビテキスト</rt></ruby>
" なのですが、これではルビのレンダリングに対応していない環境では、ベーステキストとルビテキストが横並びで表示されてしまうため、文章の内容がわかりにくくなってしまいます。そこで非対応環境用にルビテキストを括弧(カッコ)で囲んだ「ベーステキスト(ルビテキスト)」という形で表示して意味が通るようにしておくのが適切です。そこで基本形に rp
要素を加えて "<ruby><rb>ベーステキスト</rb><rp>括弧開き</rp><rt>ルビテキスト</rt><rp>括弧閉じ</rp></ruby>
" という形で使います。
また、rbc
要素, rtc
要素を用いることでそれぞれ複数の rb
要素, rt
要素をまとめて、複雑ルビマークアップを行うことができます。複雑ルビマークアップを用いることで、ベーステキストの上下にルビを振って、複合ルビを作成することができます。複雑ルビマークアップでは、ルビマークアップのレンダリングに対応していない環境のための rp
要素を指定することはできません。
単純ルビマークアップにはInternet Explorer, Safari, Chrome, Blink版Operaが対応していますが、複雑ルビマークアップに対応するUAはありません。
<ruby><rb>仙人掌</rb><rp>(</rp><rt>さぼてん</rt><rp>)</rp></ruby>
<ruby><rbc><rb>英</rb><rb>語</rb></rbc>
<rtc><rt>えい</rt><rt>ご</rt></rtc>
<rtc><rt rbspan="2">English</rt></rtc></ruby>
最初のルビマークアップは1997年2月に IETF に Internet Draft(草稿)として提出されていた Ruby in the Hypertext Markup Language という span
要素などに専用の属性を指定する方法が提案されていました。その後、1999年3月にリリースされた Internet Explorer 5.0 が独自機能として先取り実装し、2年遅れでXHTML1.1 で Ruby Annotation として W3C より正式に勧告されました。