タグtagsと要素elementsの違い

HTMLにおける要素開始/終了タグは、コマンドではありません。それは単に各要素の開始/終了位置を示すだけで、それをどのように解釈し、表現するかは、利用者側に任されています。

…と言われても何のことか、さっぱりわからない人のほうが多いんじゃないでしょうか。本にも雑誌にも、HTMLを要素の集合体として解説している記事を見かけることはまず無いからです。しかし、HTML仕様書を読んでみると、「タグを書く」というような言い方が不正確であることがわかります。HTML仕様書は、要素elementとその属性attribute、及びその値valueの解説に終始していて、『タグ』は各要素の開始タグと終了タグしか出てこないのです。場合によっては、『タグ』は省略可能だったりします。

DTD HTML 4.0 Transitionalによると、HTML文書とは以下のような階層構造を持つものです。

この図は僕がマウスでぐりぐり描いたものなので、少々乱雑ですが…
各要素が入れ子の関係になっていること、日本風の表現をするならば
親亀の上に子亀 の形になっていることがご理解いただければと思います。想像がつくかと思いますが、子亀の上に親亀を乗せてはいけません。
HTMLを書くということは、文書の内容をDTDに挙げられた要素へ分解して組み合わせ、定められた階層を持つ構造物として提出するということなのです。
なお、DTDについては矢野啓介さんのHTMLのDTDを読んでみようという解説がありますので、目を通してみることをおすすめします。

加藤泰孝さんのHTMLのコーディングチェック!!!には、HTMLの主役が要素であってタグではないということが述べられています。初めてこれを読んだとき、僕はそれがどういうことなのか理解できずにいました。本や雑誌を読んで覚えた概念とは違っていたからです。そのときまで僕が知らなかったHTMLの概念をまとめると、次のようなものがあります。

  1. HTMLは、文書の論理的な構造を示すものである。
  2. したがって、文書の体裁を整えることは、HTMLではやらない。
  3. そして、その方法は、予めDTDで決められた要素を組み合わせて使うことによる。
  4. だから、決められた要素以外の要素を使ってはいけない。
  5. 『タグ』は、要素の開始/終了の位置を示すものである。
  6. 逆に言うと、開始/終了の位置がわかっているような場合は、タグを省略することができる。
  7. 要素には、内容contentsを持つ包含要素containerと、内容を持たない空要素empty elementsとがある。
  8. 包含要素は内容の前後に開始/終了タグを書く(場合によっては終了タグ省略可能)ものだが、空要素は開始タグのみで成立する。
  9. また、要素を大別すると、文章や他の要素をひとかたまりにするまとめ要素block-level elementsと、文章を部分的に装飾するだけの叙述要素text-level elements(HTML4.0ではinline elements)とがある。
  10. まとめ要素へは他のまとめ要素や叙述要素を入れられるが、叙述要素の中には他の叙述要素のみしか入れられない。
  11. このようなHTMLの文法は、各版のHTML DTDで決められている。
  12. つまり各版のHTML DTDを読めば、全ての要素の定義がわかる。
  13. HTML DTD各版には違いがあるので、HTML文書ではどの版を用いるか指示しなくてはならない。
  14. そのため、HTML文書には、文書型宣言が必要である。

まともなHTMLを書くためには、こういった約束事を踏まえている必要があるわけですが… 
あなたはどれだけ知っていましたか?僕はjweblintを試してみるまで、自分が間違ったHTMLを書いている可能性というものを考えたことがありませんでした。

では、『タグ』はどのように定義されているか、RFC1866(HTML2.0)の3章を見てみましょう。

タグは、見出し、段落、一覧、強調文字、そして連鎖といった要素の範囲を区切ります。ほとんどのHTML要素は、まず要素名や属性を与える開始タグとして現われ、次に内容、そして終了タグと続きます。開始タグは`<'と`>'で区切られ、終了タグは`</'と`>'で区切られます。例えば以下のようにします:

<H1>これは見出しです</H1>

終了タグがない開始タグのみの要素もあります。例えば改行するときには`<BR>'タグを使います。
それから、段落(`</P>')や一覧項目(`</LI>')、定義項目(`</DT>')、定義内容(`</DD>')など、省略してもいい終了タグもあります。

要素の内容は一連のデータ文字列と入れ子になった要素です。錨など、入れ子にできない要素もあります。錨と強調は別の部分に入れるようにしてください。HTML DTDのすべての詳細は9.1, "HTML DTD"を見てください。

ですから、基本的には、開始タグと終了タグとの間に内容を入れれば、それがHTMLの構成単位である要素になります。要素の属性は、開始タグへ入れます。属性値は基本的に引用句として扱うので、引用符で囲みます。

要素=
<要素名 属性名="属性値">要素の内容</要素名>

というわけですね。『タグ』はこの要素の範囲、つまり始めと終わりを区切るだけなので、よくある『ペアで使う』などという表現は不正確です。要素の範囲が明確であれば、ペアで使わなくてもいいのです。

多くの記事では、『新しいタグを書く』ことばかりが強調されがちなように見えます。しかし、文書の組み立てを考えずにただ『新しいタグを書く』のは、HTML本来の考え方からすると本末転倒と言えます。HTMLはまず、文書の構成を考え、作者の必要に応じて書かれるべきであって、必要のない技術を見せびらかすためのものではありません。もちろん、どんな技術でも、必要なものならどんどん使った方がいいので、それを見越してHTMLでは「解釈できない要素の一つ一つにエラーの表示などはせず、単に表示しない」という姿勢をとっています。

思うに、『タグを書く』とばかりいうのは、記者がHTMLというものを「ホームページの体裁を整えるコードを実行する仕組み」と考えているからではないでしょうか。HTMLがコードの体系であることに異論はありません。しかし、HTMLにおける要素開始/終了タグは、コマンドではありません(『タグを書く』どころか、要素を『コマンド』と説明している本が存在します。仕様書のどこからそんなものを拾ってきたのでしょう?)。
繰り返しになりますが、HTMLは普通の文章に印がついているだけのものであって、実際の解釈はユーザエージェントに任されています。ユーザエージェントがどのような解釈でどのように表現しようと、論理的な整合性さえ取れていれば、HTMLの作者は別段文句を言えた立場ではないのです。 なのに、見栄えばかりを気にする立場から見ると、自分が無視されているように思えるのでしょう、「HTMLの約束事を無視してきちんと表示されないブラウザがある」などという人が後を断ちません。まあ、「人は外見による」という考え方は、人間に関する真実の一端を示していると言えますが、その人はそんなことを言いたいわけではなさそうです。

こういう基本的な約束事は約束事としてきちんと説明してほしいものですが、もろもろの解説記事はいつになったら改まるのでしょうか。ひどいときには、平気でウソを教えたあげく「正しいHTMLではないらしいのですが、気にせずどんどん使いましょう」などと書いている始末です。わかっていてあえてやる場合と、初めからわかっちゃいない場合とでは、世界に迷惑を掛ける点では変わらないものの、後者のほうが歯止めがかからないのでより凄惨だと思うんですけどねえ。しかもそういう人のほうが圧倒的多数を占める現状では、間違いの拡大再生産が行われているために、正当な指摘は煙たがられるようですし。特にメディアに対しては、とてもかなわないという気がします。僕は、ほとんどあきらめました。

Copyleft 1998 魔術幻燈
poetlabo@cap.bekkoame.or.jp