« CSS Nite LP Disk 3 観戦記 - 補 | トップページ | 定義リストの違和感(続) »

2007-05-26

定義リストの違和感

実は前々から定義リストの記述モデルって、どうにも気持ち悪いなと感じてます。

他所さまであまり突っ込んでいるのを見かけないので、僕の知識不足か誤解から来ているのかな..と、ずっと口にするのを避けてたんですが、HTML WG が発足して、HTML のモデルに関する議論が(少なくとも欧米では)盛んになってきていることもあるので、恥をかくのを覚悟で、書き留めておきます。

何かご存知の方は、是非、ご教示を。

HTML 4.01 の定義リスト

仕様書の説明

Definition lists vary only slightly from other types of lists in that list items consist of two parts: a term and a description. The term is given by the DT element and is restricted to inline content. The description is given with a DD element that contains block-level content.

Lists in HTML documentsより

(定義リスト(dl)は、インライン要素のみを内包できる術語(dt)と、ブロック要素も内包できる説明文(dd)から成るというような主旨。)

仕様書に示されている用例

まずは、ごく一般的なユースケース。

<DL>
<DT>Dweeb
<DD>young excitable person who may mature
into a <EM>Nerd</EM> or <EM>Geek</EM>

<DT>Hacker
<DD>a clever programmer

<DT>Nerd
<DD>technically bright but socially inept person
</DL>

そして注目して欲しい方の用例。術語・説明文が同時に複数存在するケース。

<DL>
<DT>Center
<DT>Centre
<DD> A point equidistant from all points on the surface of a sphere.
<DD> In some field sports, the player who holds the middle position on the field, court, or forward line.
</DL>

要するに術語と説明文の対応関係は、必ずしも 1対1 の関係にはならず、1対n、n対1、n対n になることすら許容されています

素人くさい疑問でなんですけど、そういえば、プログラム言語で n対n の連想配列を記述できるモデルってあるのかな?

記述モデルの背景にある(と思われる)もの

2007年5月28日 追記:
DTD をチェックしていたら、定義文(dd)なしの術語(dt)や、術語(dt)なしの定義文(dd)が許容されているという、重要なポイントを見落としていたことに気づきました。詳しくは定義リストの違和感(続)を参照してください。

構文的には、「連続する1つ以上の dt要素と、その直後の連続する 1つ以上の dd要素」を一群と見なせば良いことなので、少なくとも実装上は、n対n の関係であっても術語と説明文を対応づけることは可能でしょう。

この構文ルールが明確だからこそ、HTML では dt要素も dd要素も終了タグを省略できるわけですし(もちろん XHTML では省略不可です。念のため)、おそらく、なるべくシンプルで人間に優しい省エネな記述モデルを志向したことが、この定義リストの記述モデルを生み出した大きな理由のひとつなんじゃないかとも思います。(あくまで想像ですけど。でも、これはこれで、実は HTML の普及を支える重要な因子ともいえそう。)

気持ち悪さの原因

でも、個人的にはどうしても複数ある同義語と、多義語の説明文をグループ化するための中間的な要素が欲しい気がします。DOM で処理するにせよ CSS をあてるにせよ、実装が中途半端だと、エラーの原因にもなりますし、なにより構造化文書的に、このフラットさは気持ち悪くないですか?(^o^;)

XHTML 2.0 では、それに相当するもの(術語と説明文のグループ化のための要素)として、di 要素が提案されていますが、HTML 5 の方では、今のところ、それと同等の存在はないようです。

<dl>
<di>
<dt>Dweeb</dt>
<dd>young excitable person who may mature into a <em>Nerd</em> or <em>Geek</em></dd>
</di>

<di>
<dt>Hacker</dt>
<dd>a clever programmer</dd>
</di>

<di>
<dt>Nerd</dt>
<dd>technically bright but socially inept person</dd>
</di>
</dl>

このブログの読者の皆さんはどう思います?似たような感覚をお持ちになったことってありませんか?

|

« CSS Nite LP Disk 3 観戦記 - 補 | トップページ | 定義リストの違和感(続) »

[Web]XHTML」カテゴリの記事

コメント

itochan さん、コメント、ありがとうございます。

for 属性とは、面白いところにお気づきになりましたね。確かに少なくとも「気持ち悪い」とは思わないと思います。

ただ、for 属性は、属性型が IDREF なので、基本的に 1対1 の対応関係しか記述できないのがネックです。より良いモデルとして、td, th 要素の headers 属性がもつ、IDREFS という属性型があります。これならカンマ区切りで複数の id を参照できるので、n対n の対応関係も記述可能です。

ただ、この headers 属性が scope 属性の影に隠れていることからも察しがつくとは思いますが、いちいち個々の id と参照先を一つ一つ記述していくのは、あまりモデルとしてスマートじゃないような気がするんですけどいかがでしょう?

(少なくとも RDF のような有向グラフになるので、悪いモデルでないとは思いますが、人力によるマークアップコストと目視による可読性的にはちょっと...。)

投稿: ゆう@管理人 | 2007-07-18 12:53

label要素のfor属性のような対応付けがあれば「気持ち悪く」ないでしょうか?

投稿: itochan | 2007-07-18 11:43

同義語や多義語の n対n の関係を dt1対dd1 の定義リストにまとめてしまうことは、たとえば以下のようにマークアップすることで、今の仕様でもできるんですが、フラットなところは依然 変わらないので、根本的な解決にはなりそうにありません。(なお、dt はインライン要素しか許容していないので、dt 要素に ul 要素や ol 要素をネストするのはアウト。)

<dl>
<dt><dfn>術語1</dfn>, <dfn>術語2</dfn>, <dfn>術語3</dfn></dt>
<dd>
<ul>
<li>説明文1</li>
<li>説明文2</li>
</ul>

</dd>
</dl>

ちなみに、XHTML 2.0 のモデルを見ると、

dl ::= label?, (( dt | dd)+ | di+)

となっているので、di 要素を間に挟まずに、従来のように記述することも可能です。

投稿: ゆう@管理人 | 2007-05-27 22:26

XHTML 2.0のやつもどうもしっくりこないような気がしますねえ。

あくまで「気がする」だけなんですけどw。

<di>っていうタグを加えるより、<dt>の同義語・多義語対応タグ<dtn>みたいなやつを作った方がタグの節約にもなると思うんですけどねえ・・・。

投稿: デッドリー | 2007-05-27 21:19

やっぱり、皆さん、色々と感じながら試行錯誤されているんですね。(むしろ僕の方こそ)勇気出して、このエントリーを書いて良かった〜って気分です。(笑)

投稿: ゆう@管理人 | 2007-05-27 09:50

>ol や ul の中に di レベル相当に分割した dl をネスト
やります、やります(笑)
でもスマートじゃないですよね、違和感あります。無理してる感というか…。

自分は仕様書をちゃんと読んだことがないので、これでいいのかなぁ…なんて思いながら作っていたので、そういう意味ではこの記事を読んで、なんていうか、ホッとしたところはあります (笑)

投稿: masaya | 2007-05-27 09:40

okuryu さん、コメント、ありがとうございます。

ul, ol と dl って、配列と連想配列のような関係ですし、dl 自体の存在意義は充分あるはずなんですけど、イマイチ、使い勝手が中途半端で困りますよね。

僕も、どうしてもグループ化させたいときは、結局、e-luck さんの del.icio.us コメントでも指摘されているように、ol や ul の中に di レベル相当に分割した dl をネストしたりしてますけど、これもこれで違和感がありますし...。

> Safariだとcontentプロパティに指定してる文字が化けてます

うげ。本当だ!

早速、修正しました。すみません。大分 前に修正したんですけど、どこかで CSS ファイルを昔のもので上書きしてたっぽいです。(- -;;)ゞ

ご指摘、感謝です。

投稿: ゆう | 2007-05-27 08:27

確かにはっきりしないところが気持ち悪いですね。ulやolを使ったほうが無難なのかなとも思ったりします。あと関係ないですが、Safariだとcontentプロパティに指定してる文字が化けてます><

投稿: okuryu | 2007-05-27 01:08

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 定義リストの違和感:

« CSS Nite LP Disk 3 観戦記 - 補 | トップページ | 定義リストの違和感(続) »