HTML 4 から XHTML へ

この章では、 HMTL 4 と XHTML 1.0 の違いに注目します。

contents

  1. 文字コード
  2. 大文字と小文字
  3. 終了タグ
  4. 空要素
  5. 属性値の引用符
  6. 属性の最小化の禁止
  7. script 要素と style 要素
  8. name 属性の廃止と id 属性への移行
  9. 使用言語
  10. 要素の禁止
  11. タグ付けの注意

文字コード

XML 文書では、デフォルトでは、UNICODE である UTF-8 か UTF-16 が設定されますが、それ以外の文字コードを用いる場合は、必ず XML 宣言で、 encoding 属性を与えなければなりません。

XML 宣言の encoding 属性

<?xml version="1.0" encoding="ISO-2022-JP"?>

XHTML では、これに重ねて、 head 要素内の meta http-equive 宣言でも指定する必要が有ります。

head 要素内の meta-http-equiv 宣言

<meta http-equiv="Content-type"
      content='text/html; charset="ISO-2022-JP"'/>

XML 宣言における encoding 属性の方が優先されますが、必ず同時に同じコードを指定しましょう。

大文字と小文字

XML では、大文字と小文字を厳格に区別します。 XHTML の要素と属性はすべて小文字でしか定義されていません。属性値は HTML の場合と同様の扱いですが、要素名と属性名は必ず小文字で書かなければなりません。例えば、<P><p> は異なるタグとして解釈されます。

終了タグの必須

HTML では、ある種の要素に対しては、終了タグが省略可能でした。例えば、LIST要素のLI要素や、TABLE要素のTD要素などは習慣的にも省略されてきました。

しかし、 XML では全ての要素に付いて、終了タグが必須になりました。

正しい XHTML ;終了タグが有る

<ul>
  <li>項目一</li>
  <li>項目二</li>
</ul>

誤った XHTML ;終了タグが省略されている

<ul>
  <li>項目一
  <li>項目二
</ul>

空要素

<meta>, <br>, <hr>, <img>, <frame> などの空要素に付いては、終了の目印として、<meta />, <br />, <hr />, <img />等のように、 /> で終わる必要が有ります。

また、 <br></br> のように記述する事が XML で認められていますが、旧来の HTML 解釈ブラウザでは、どのように振る舞うか分かりません。

W3C の仕様書では、後方互換性を保つ為に、/> の直前に半角スペースを挿入するよう、示唆されています。

<img src="./image.gif" />

属性値の引用符

HTML では、属性値の引用符はある場合には省略可能でした。しかし、 XHTML では全ての属性値を引用符で括るように定義されています。

正しい XHTML ;引用符が有る

<table border="2">
<tr>
<td> hogehoge </td>
</tr>
</table>

誤った XHTML ;引用符が無い

<table border=2>
<tr>
<td> hogehoge </td>
</tr>
</table>

属性の最小化の禁止

HTML では、ある種の属性は属性値を省略できました。例えば、<frame noresize>, <dl compact> などです。

しかし、 XML では、属性は必ず属性値を持たなければなりません。

正しい XHTML ;属性値を持つ

<frame noresize="noresize" />

誤った XHTML ;属性値が省略されている

<frame noresize />

空要素のタグの末尾が /> になっている事に注意して下さい。

script 要素や style 要素

XML では、&lt;, &amp; などの実体が記述されていると、スクリプトとして処理される前に、実体参照として、<, & であると認識してしまう。これらの実体の展開を避けるには、 CDATA マークされた内側に記述する必要が有る。

Cデータ部;

<script>
 <![CDATA[
 ... エスケープされていないスクリプト内容 ...
 ]]>
</script>

CDATA section 内( <![CDATA[ から ]]> まで)では、マークアップとして認識される文字列が解釈されるのをエスケープするために用いられる。例えば、 < (less than) や、 & (and) は、 CDATA section 内部では、単なるテキストとして扱われ、意味を持たない。そのため、 &amp; や &lt; を用いてエスケープする必要は無いし、エスケープできない。但し、 > は、CDATA部の終了 ]]> で無い場合、混乱を避けるために、 &gt; を用いてエスケープする必要がある。

また、従来は、サポートしていないブラウザが、ソースをモニタに表示してしまうのを避ける為、スクリプトやスタイルは、 <!----> でコメント・アウトするのが慣習だった。しかし、 XML 解釈では、コメントは何もせず無視する事が許されるので、スクリプトやCSSが全く働かない可能性も有る。これを避ける為には、スクリプトやスタイルをコメント・アウトしないか、外部スタイルシートを利用するよう示唆されている。

機能を持たない単なるコメントは、 <!----> を用いれば良い。但し、-- と云う文字列(ダブル・ハイフン)は、コメント内部では用いられないが、コメント内部では、 <, & などの要素の開始文字を直接含んでも構わない。

コメント;

<!--
ここはコメント。 <p> の様にエスケープしないで記述しても構わないし、
DTD の中に記述しても構わない。
-->

name 属性の廃止と id 属性への移行

HTML では、幾つかの要素に対して、name 属性が用意されていた。

しかし、 XHTML 1.0 では、name 属性は廃止予定であり、変わりに id 属性を用いなければならない。働きは、 HTML 4 で定義されたままである。

W3C では、後方互換の為に、XHTML 文書において、name 属性と id 属性を同時に併用するよう示唆されている。

正しい XHTML

<frame name="hogehoge" id="hogehoge" />

非推奨な XHTML

<frame name="hogehoge" />

HTML 4 では、 name 属性は限られた要素にしか定義されていなかったが、 id 属性はあらゆる要素に対して与える事が可能。

暫定的な対応としては、name 属性と id 属性の両方を与えることで、後方互換を保つことができる。N.C.4.xなどでは有効。

使用言語

要素の言語は、 lang 属性と、 xml:lang 属性の双方を同時に用いなければならず、 xml:lang 属性の方が優先される。

<p xml:lang="ja" lang="ja">

要素の禁止事項

XML の DTD では、要素に対して、その子孫要素の禁止が指定できない。しかし、原則 HTML 4 に従うべきだろう。 W3C の「 XHTML 1.0 仕様書」で挙げられている禁止事項は次の通り;

a
他の a 要素を含んではならない。
pre
img, object, big, small, sub, sup 要素を含んではならない。
button
input, select, textarea, label, button, form, fieldset, iframe, isindex 要素を含んではならない。
label
他の label を含んではならない。
form
他の form 要素を含んではならない。

タグ付けの注意

HTML 4 も構造化文書でした。しかし、 XML ではその利用目的や可能性からして、より木目細かいマークアップが望まれます。そうすることで、データとしての有用性が高まります。 XHTML も XML の一例ですからその恩恵は当然受けられます。

正しい HTML 4 ; XML としては望ましくない;

<h1>LaTeX 入門</h1>
  <h2>TeX と LaTeX</h2>
    <p>
    LaTeX は、 Donald Knuth 氏が 78 年から 82 年に掛けて作った
    TeX と云う文書処理システムに、 Leslie Lamport 氏が
    大量のマクロを書き加えて使い易くしたものです。
    </p>
    <p>
    LaTeX や LaTeX2e などのマクロ集と区別する為に、
    TeX 本体の事を Plain TeX と呼びます。
    </p>
  <h2>LaTeX の例</h2>
    <p>
    LaTeX の文書は必ず、 \documentstyle{...style...} と
    \begin{document} で始まり、\end{document} で終わります。
    </p>

このサンプルコードをXML文書として表示させてみましょう;

何が望ましくないのでしょうか?ヒントはインデントです。

上の例では、わかりやすくする為に、意味の階層に対して、インデントが付いています。 XML では、このように区別できる場合は全てマークアップしておいた方が、後々扱い易い事が良くあります。

望ましい XML ;

<div class="chapter">
<h1>LaTeX 入門</h1>
  <div class="section">
  <h2>TeX と LaTeX</h2>
    <div class="paragraph">
    <p>
    LaTeX は、 Donald Knuth 氏が 78 年から 82 年に掛けて作った
    TeX と云う文書処理システムに、 Leslie Lamport 氏が
    大量のマクロを書き加えて使い易くしたものです。
    </p>
    <p>
    LaTeX や LaTeX2e などのマクロ集と区別する為に、
    TeX 本体の事を Plain TeX と呼びます。
    </p>
    </div>
  </div>
  <div class="section">
  <h2>LaTeX の例</h2>
    <div class="paragraph">
    <p>
    LaTeX の文書は必ず、 \documentstyle{...style...} と
    \begin{document} で始まり、\end{document} で終わります。
    </p>
    </div>
  </div>
</div>

このサンプルコードもXML文書として表示させてみましょう;

いかにもファイルサイズが大きくなってしまいました。しかし、XML としてはこれで良いのです。

こうする事で、例えば h1 以下の固まり(チャプター)は div.chapter で、h2 以下の固まり(セクション)は div.section で、セクション内の段落の固まりは div.paragraph で指定して一まとめに扱えます。

もし、特定の固まりだけ特別扱いしたい場合は、 id 属性を用いて、固有の名前を付けて区別する事が出来ます。 id 属性の属性値は一つのファイルの中でユニークでなければなりません。複数回同一の id 属性値が表れるファイルはエラーになりますので、注意して名付けて下さい。命名には、数字以外の、普通の文字から始まる以外には制約は有りません。

SEO [PR] !uO z[y[WJ Cu