Wrong HTML - XHTML 1.1について

XHTML 1.0との違い

XHTML 1.0と大きく違うところはモジュール化だと思います。このモジュール化というのは要素などの宣言を機能別に小分けにしたものでModularization of XHTMLにて定義されていて、モジュールを組み合わせて作られるXHTMLをXHTMLファミリーと呼びXHTML 1.1もその一員となります。

このことでHTMLの全ての要素を処理するには負担が大きいような端末では必要最小限のものを組み合わせればいいわけですし、足りなければ別に定義したものを追加することもできるわけです。

そしてモジュールの組み合わせを定義したものをドライバと呼び、XHTML 1.1のDTDもドライバとなっています。

さらにXHTML 1.0では推奨しないとされていた要素などが廃止されました。これらの要素はLegacy Moduleとして定義されていて、使用したい場合は追加する必要があります。属性の変更点としてはLang属性が廃止されxml:langのみへ、a要素、Map要素のname属性もなくなりid属性で指定する必要があります。また、新しくRuby要素が追加されました。

実際にXHTML 1.0からXHTML 1.1へ書き換える場合には文書型を<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">へ変更、html要素のlang属性とxml:lang属性をxml:langのみへ、idとname属性の両方を指定していたものをid属性のみへ、という変更を忘れないようにしましょう。Transitionalなどを使用していた場合は使用できる要素、属性に注意してください。Validatorをうまく活用すれば楽だと思います。

HTML 4.01などから書き換える場合にはXHTML 1.0 へ移行するでXHTML 1.0へ一度変更してからのほうが良いかもしれません。

モジュール一覧

XHTML 1.1で使用されるモジュールを整理しておきます。

表の中で"要素名&"というのが出てきますが、これはそのモジュールを使用したときはその要素へ属性リストを追加する、という意味です。また、"属性名*"は必須属性です。

Attribute Collections

共通属性の集合です。このうちEventsは Intrinsic Events Moduleが選択されたとき、またStyleはStyle Attribute Moduleが選択されたときに定義され、それ以外はEmptyとなる。

集合名属性
Core class , id , title
I18N xml:lang
Events onclick , ondblclick , onmousedown , onmouseup , onmouseover , onmousemove , onmouseout , onkeypress , onkeydown , onkeyup
Style style(非推奨)
Common Core + Events + I18N + Style

Topへ戻る

Core Modules

XHTML ファミリー必須のコアモジュールです。

Structure Module

要素属性最小内容
bodyCommon(Heading | Block | List)*
headI18N , profiletitle
htmlI18N , version , xmlnshead, body
titleI18NPCDATA

Topへ戻る

Text Module

要素属性最小内容
abbrCommon(PCDATA | Inline)*
acronymCommon(PCDATA | Inline)*
addressCommon(PCDATA | Inline)*
blockquoteCommon, cite (URI)(PCDATA | Heading | Block | List)*
brCoreEMPTY
citeCommon(PCDATA | Inline)*
codeCommon(PCDATA | Inline)*
dfnCommon(PCDATA | Inline)*
divCommon(PCDATA | Flow)*
emCommon(PCDATA | Inline)*
h1Common(PCDATA | Inline)*
h2Common(PCDATA | Inline)*
h3Common(PCDATA | Inline)*
h4Common(PCDATA | Inline)*
h5Common(PCDATA | Inline)*
h6Common(PCDATA | Inline)*
kbdCommon(PCDATA | Inline)*
pCommon(PCDATA | Inline)*
preCommon, xml:space="preserve"(PCDATA | Inline)*
qCommon, cite (URI)(PCDATA | Inline)*
sampCommon(PCDATA | Inline)*
spanCommon(PCDATA | Inline)*
strongCommon(PCDATA | Inline)*
varCommon(PCDATA | Inline)*

このモジュールの最小内容モデルはいくつかの内容セットを定義するので、以下に示します。

Heading
h1 | h2 | h3 | h4 | h5 | h6
Block
address | blockquote | div | p | pre
Inline
abbr | acronym | br | cite | code | dfn | em | kbd | q | samp | span | strong | var
Flow
Heading | Block | Inline

Topへ戻る

Hypertext Module

要素属性最小内容
aCommon, accesskey (Character), charset (Charset), href (URI), hreflang (LanguageCode), rel (LinkTypes), rev (LinkTypes), tabindex (Number), type (ContentType)(PCDATA | Inline - a)*

このモジュールを選択するとText ModuleInlineセットにa要素が追加される。

List Mudule

要素属性最小内容
dlCommon(dt | dd)+
dtCommon(PCDATA | Inline)*
ddCommon(PCDATA | Flow)*
olCommonli+
ulCommonli+
liCommon(PCDATA | Flow)*

このモジュールは最小内容モデルが"(dl | ol | ul)+"を備えたListセットを定義し、Text ModuleFlowセットにListセットが追加される。

Topへ戻る

Text Extension Modules

Presentation Module

要素属性最小内容
bCommon(PCDATA | Inline)*
bigCommon(PCDATA | Inline)*
hrCommonEMPTY
iCommon(PCDATA | Inline)*
smallCommon(PCDATA | Inline)*
subCommon(PCDATA | Inline)*
supCommon(PCDATA | Inline)*
ttCommon(PCDATA | Inline)*

このモジュールを選択すると、hr要素がText ModuleBlockセットに追加され、その他の要素はText ModuleInlineセットに追加される。

Topへ戻る

Edit Module

要素属性最小内容
delCommon, cite (URI), datetime (Datetime)(PCDATA | Flow)*
insCommon, cite (URI), datetime (Datetime)(PCDATA | Flow)*

このモジュールが使用される場合はdelとins要素がText ModuleInlineセットに追加される。

Bi-directional Text Module

双方向(テキストを左右どちらから読むか)モジュールです。

要素属性最小内容
bdoCore, dir* ("ltr" | "rtl")(PCDATA | Inline)*

このモジュールが使用される場合はbdo要素がText ModuleInlineセットに追加され、dir属性が属性集合I18Nに追加される。

Topへ戻る

Forms Module

要素属性最小内容
formCommon, accept (ContentTypes), accept-charset(Charsets), action* (URI), method ("get"* | "post"), enctype (ContentType)(Heading | List | Block - form | fieldset)+
inputCommon, accept (ContentTypes), accesskey (Character), alt (Text), checked ("checked"), disabled ("disabled"), maxlength (Number), name (CDATA), readonly("readonly"), size (Number), src (URI), tabindex (Number), type ("text"* | "password" | "checkbox" | "button" | "radio" | "submit" | "reset" | "file" | "hidden" | "image"), value(CDATA)EMPTY
selectCommon, disabled ("disabled"), multiple ("multiple"), name (CDATA), size (Number), tabindex (Number)(optgroup | option)+
optionCommon, disabled ("disabled"), label (Text), selected ("selected"), value (CDATA)PCDATA
textareaCommon, accesskey (Character), cols* (Number), disabled ("disabled"), name (CDATA), readonly ("readonly"),rows* (Number), tabindex (Number)PCDATA
buttonCommon, accesskey (Character), disabled ("disabled"),name (CDATA), tabindex (Number), type ("button" |"submit"* | "reset"), value (CDATA)(PCDATA | Heading | List | Block - Form | Inline - Formctrl)*
fieldsetCommon(PCDATA | legend | Flow)*
labelCommon, accesskey (Character), for (IDREF)(PCDATA | Inline - label)*
legendCommon, accesskey (Character)(PCDATA | Inline)+
optgroupCommon, disabled ("disabled"), label* (Text)option+

このモジュールはふたつの内容セットを定義する。

Form
form | fieldset
Formctrl
input | select | textarea | label | button

Topへ戻る

Tables Module

要素属性最小内容
captionCommon(PCDATA | Inline)*
tableCommon, border (Pixels), cellpadding (Length), cellspacing (Length), datapagesize (CDATA), frame ("void" | "above" | below" | "hsides" | "lhs" | "rhs" | "vsides" | "box" | "border"), rules ("none" | "groups" | "rows" |"cols" | "all"), summary (Text), width (Length)caption?, ( col* | colgroup* ), (( thead?, tfoot?, tbody+ ) | ( tr+ ))
tdCommon, abbr (Text), align ("left" | "center" | "right" |"justify" | "char"), axis (CDATA), char (Character),charoff (Length), colspan (Number), headers (IDREFS), rowspan (Number), scope ("row", "col", "rowgroup","colgroup"), valign ("top" | "middle" | "bottom" | "baseline")(PCDATA | Flow)*
thCommon, abbr (Text), align ("left" | "center" | "right" |"justify" | "char"), axis (CDATA), char (Character),charoff (Length), colspan (Number), headers (IDREFS), rowspan (Number), scope ("row", "col", "rowgroup","colgroup"), valign ("top" | "middle" | "bottom" | "baseline")(PCDATA | Flow)*
trCommon, align ("left" | "center" | "right" | "justify", "char"), char (Character), charoff (Length), valign ("top" | "middle" | "bottom" | "baseline")(td | th)+
colCommon, align ("left" | "center" | "right" | "justify", "char"), char (Character), charoff (Length), span (Number), valign ("top" | "middle" | "bottom" | "baseline"), width (MultiLength)EMPTY
colgroupCommon, align ("left" | "center" | "right" | "justify", "char"), char (Character), charoff (Length), span (Number), valign ("top" | "middle" | "bottom" | "baseline"), width (MultiLength)col*
tbodyCommon, align ("left" | "center" | "right" | "justify", "char"), char (Character), charoff (Length), valign ("top" | "middle" | "bottom" | "baseline")tr+
theadCommon, align ("left" | "center" | "right" | "justify", "char"), char (Character), charoff (Length), valign ("top" | "middle" | "bottom" | "baseline")tr+
tfootCommon, align ("left" | "center" | "right" | "justify", "char"), char (Character), charoff (Length), valign ("top" | "middle" | "bottom" | "baseline")tr+

このモジュールが使用される場合はText ModuleBlockセットにtable要素が追加される。

Topへ戻る

Image Module

要素属性最小内容
imgCommon, alt* (Text), height (Length), longdesc (URI), src* (URI), width (Length)EMPTY

このモジュールが使用される場合はText ModuleInlineセットにimg要素が追加される。

Client-side Image Map Module

要素属性最小内容
a&coords (CDATA), shape ("rect" | "circle" | "poly" | "default")n/a
areaCommon, accesskey (Character), alt* (Text), coords (CDATA), href (URI), nohref ("nohref"), shape ("rect"* | "circle" | "poly" | "default"), tabindex (Number)EMPTY
img&usemap (IDREF)n/a
input&usemap (IDREF)n/a
mapI18N, Events, class (NMTOKEN), id* (ID), title (CDATA)((Heading | Block) | area)+
object&usemap (IDREF)Note: Only when the object module is included

このモジュールが使用される場合はText ModuleInlineセットにmap要素が追加される。

Topへ戻る

Server-side Image Map Module

要素属性注意事項
img&ismap ("ismap") 
input&ismap ("ismap")Forms Module か Basic Forms Moduleが選択された場合

Object Module

要素属性最小内容
objectCommon, archive (URIs), classid (URI), codebase (URI), codetype (ContentType), data (URI), declare ("declare"), height (Length), name (CDATA), standby (Text), tabindex (Number), type (ContentType), width (Length)(PCDATA | Flow | param)*
paramid (ID), name* (CDATA), type (ContentType), value (CDATA), valuetype ("data"* | "ref" | "object")EMPTY

このモジュールが使用される場合はText ModuleInlineセットにobject要素が追加される。

Topへ戻る

Intrinsic Events Module

要素属性注意事項
a&onblur (Script), onfocus (Script) 
area&onblur (Script), onfocus (Script)Client-side Image Map Moduleも使用される場合
frameset&onload (Script), onunload (Script)Frames Moduleも使用される場合
form&onreset (Script), onsubmit (Script)Basic Forms か Forms Moduleが使用される場合
body&onload (Script), onunload (Script) 
label&onblur (Script), onfocus (Script)Forms Moduleが使用される場合
input&onblur (Script), onchange (Script), onfocus (Script), onselect (Script)Basic Forms か Forms Moduleが使用される場合
select&onblur (Script), onchange (Script), onfocus (Script)Basic Forms か Forms Moduleが使用される場合
textarea&onblur (Script), onchange (Script), onfocus (Script), onselect (Script)Basic Forms か Forms Moduleが使用される場合
button&onblur (Script), onfocus (Script)Forms Moduleが使用される場合

Topへ戻る

Metainformation Module

要素属性最小内容
metaI18N, content* (CDATA), http-equiv (NMTOKEN), name (NMTOKEN), scheme (CDATA)EMPTY

このモジュールが選択された場合、meta要素はStructure Moduleで定義されているheadの内容モデルに追加される。

Scripting Module

要素属性最小内容
noscriptCommon(Heading | List | Block)+
scriptcharset (Charset), defer ("defer"), src (URI), type*(ContentType), xml:space="preserve"PCDATA

このモジュールが使用される場合は、script, noscript要素はText ModuleBlock, Inlineセットに追加される。さらにscript要素はStructure Moduleで定義されているheadの内容モデルに追加される。

Topへ戻る

Style Sheet Module

要素属性最小内容
styleI18N, media (MediaDesc), title (Text), type* (ContentType), xml:space="preserve"PCDATA

このモジュールが使用される場合は、Structure Moduleで定義されているheadの内容モデルにstyle要素が追加される。

Style Attribute Module

Style属性のモジュールです。属性集合のStyleがアクティブになりますが、XHTML 1.1では非推奨となっています。

Link Module

要素属性最小内容
linkCommon, charset (Charset), href (URI), hreflang (LanguageCode), media (MediaDesc), rel (LinkTypes), rev (LinkTypes), type (ContentType)EMPTY

このモジュールが使用される場合は、Structure Moduleで定義されているheadの内容モデルにlink要素が追加される。

Topへ戻る

Base Module

要素属性最小内容
basehref* (URI)EMPTY

このモジュールが使用される場合は、Structure Moduleで定義されているheadの内容モデルにbase要素が追加される。

Ruby Module

Ruby Annotationで定義されている、テキストにルビを振る際のモジュールです。

要素属性最小内容
rubyCommon(rb, (rt | (rp, rt, rp)))
rbcCommonrb+
rtcCommonrt+
rbCommon(PCDATA | Inline - ruby)*
rtCommon, rbspan (CDATA)(PCDATA | Inline - ruby)*
rpCommonPCDATA*

現在はInternet Explorerしか対応していない(はず)ですが、これはW3Cがまだ勧告とする前に独自実装されたため、その全てをサポートしているわけではありません。

日本語では振り仮名を付ける際によく使用されると思います。「漢字」にルビを振るとして説明すると、今までは「漢字(かんじ)」としていました。この「漢字(かんじ)」のうち「漢字」の部分をルビベーステキスト(ruby base text)、「かんじ」の部分をルビテキスト(ruby text)、()をルビ括弧 (ruby parenthesis)と覚えてしまえば、使用するのは簡単です。

では、実際にマークアップするとしましょう。

ルビを使用したい文字列をruby要素で囲みます。

<ruby>漢字(かんじ)</ruby>

続けてルビベースの部分をrb要素で囲み、ルビテキストをrt要素で囲みます。

<ruby>
<rb>漢字</rb>
(<rt>かんじ</rt>)
</ruby>

全てのWWWブラウザがこの要素を解釈できればいいのですが、現状ではそうではないので対応していないWWWブラウザの為にルビ括弧を残しておきたいので()をrp要素で囲みます。

<ruby>
<rb>漢字</rb>
<rp>(</rp>
<rt>かんじ</rt>
<rp>)</rp>
</ruby>

これでInternet Explorer5以上では

Internet Explorerで表示したルビの例

と表示され、サポートしていない場合は今まで通り「漢字(かんじ)」と表示されます。

最後に

XHTML 1.1を使用する場合、問題となるのが古いブラウザへの対応です。リンクのアンカー名をid属性で指定すると一部のブラウザでは機能しません。また、XML宣言が表示されてしまうものもあるようです。

XML宣言が表示される程度ならまだいいのですが、リンクが機能しないとユーザーはページの先頭から辿っていかなくてはならず不便です。わたしも以前に全てのページをXHTML 1.1へ書き直したのですが、この問題のために一部の文書をXHTML 1.0へ変更して、a要素のname属性での名前付けにしました。

時々ブラウザを指定しているサイトがありますが、特定のものを強要するのはどうかと思いますし、様々な理由で最新のものを使えない(もしくは意図的に使用しない)こともあるでしょう。新しい技術を使用するのは難しいものですね。

Topへ戻る