2005年12月 - マーク付けノート

目次

2005-12-21: XHTML と実体参照

だらだらまとめていたら北村さんが同様の記事を書いていたので、多少端折りました。でも長いな。

どこにどうコメントしていいのか分からないのでかいつまんで。

単なる XML 文書としての XHTML だとしても、やはり XHTML 1.1 DTD が DOCTYPE 宣言にて参照されている以上、™ の実体が定義されている事に変わりはないわけだから。やはり Safari がおかしいんでわ。

以下、まず単なる XML 文書としての処理のおはなしっす。例によって仕様書を参照。

とっても重要なことですが、XML プロセサには妥当性を検証するプロセサとしないプロセサの二種類があります。そしてかつ、妥当性を検証しないプロセサは文書実体以外の文書の断片を読み込む必要はないとされています。これは余計なトラフィックや処理を発生させないためです。

僕の知る限り、現時点の最新版の IE も Firefox も Safari も Opera も妥当性を検証しないプロセサです。したがって外部実体を取得する必然性はありません。Safari の解析は XML プロセサとしては至ってまっとうなものです。

ついでなので、メジャーどころの UA の XML プロセサの外部実体関連の実装を調べてみました (かなり適当にて注意、特に Opera は Win 版は異なってたりするかも)。

著名 UA の XML 外部実体の扱い
Internet Explorer 6.? (Win)Firefox 1.5 (Mac)Opera 8.51 (Mac)Safari 1.3.1
妥当性の検証しないしないしないしない
外部実体の取得する (バグあり)しないしないしない
外部実体が存在する際の不明な実体参照の扱い-誤り (レンダリング中止)空文字列に置換誤り (空文字列に置換)
公開識別子への対応なしあり (XHTML, MathML)あり (XHTML, ただし適当)なし

公開識別子への対応というのは、具体的には文書型宣言で XHTML や MathML の公開識別子が指定されている場合に、対応する DTD を UA が内部的に持っているものに置き換えてしまうということです。仕様書の次の記述に則っています。

システム識別子以外に、外部実体は、公開識別子を含んでもよい。実体の内容を取り出す XML プロセサは、公開識別子及びシステム識別子並びにこの仕様の範囲外の付加的な情報をどのように組み合わせて、代わりの統一資源識別子 (URI) 参照の生成を試みてもよい。

ざっと調べた感じだと、例えば Firefox は W3C 勧告の各 XHTML の公開識別子をシステム識別子 resource://gre/res/dtd/xhtml11.dtd に結びつけて処理しています。Opera の場合はもう少し適当で、公開識別子に "XHTML" という文字列があれば XHTML 用の DTD (のようなもの?) を結びつけるようです。

念のため付け加えると、Firefox や Opera も、これらの「特に対応した」公開識別子で指定された以外の外部実体を参照することはありません。例えば、以下の XML 文書を解析させてみれば、これらの UA が外部実体を読み込んでいないことはよく分かると思います。

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>外部実体テスト</title>
  </head>
  <body>
    <p>&copy;</p>
  </body>
</html>

一方 Safari は元々こういった例外的な扱いをしていないため、公開識別子に関わらず実体参照を誤りと見なしているというわけです。まあもっとも、Safari の XHTML への対応状況を見ると、a 要素はちゃんとリンクとして扱うし、img 要素は画像に置換するし、id 属性もフラグメントとして機能するので、文字実体が未定義なのは単なる実装漏れだとは思いますが。

あんまりだらだら書いてもあれなので以下まとめに入りますが、XML の実体参照というやつは色々と問題をはらんでいます。今回のケースのように、個々の DTD に対してアプリケーション側がいちいち対応しなければならないのというのがその最たるものです。もちろん IE のように毎回 DTD を読みに行くという解もありますが、個人的にはモジュール DTD をいちいち取得するのは輪を掛けて馬鹿馬鹿しいと思います (MSIE 用 XHTML 1.1 テスト文書 を IE でレンダリングするのに、どれほど無駄なトラフィックと時間とマシンパワーを要するかお試しあれ)。

そのような事情から、XML 方面の主流は「実体は極力使わないようにしよう」という方向に進んでいます。例えば現在策定中の XML 応用の仕様でも、DocBook 5.0 では文字実体の廃止が確定していますし (そもそも DTD が非標準スキーマ)、XHTML 2.0 でも Character entities: do we still need them? という議論が行われていました (こちらは結局存続する方向でまとまったようですが)。

そんなわけで、汎用性を考えるならなるべく実体は使わないことをお勧めします。そもそも UTF-8 なら直接記述できるわけですし、文字コードやツールの問題で入力不可能/困難な文字があるなら、そのときは対応する文字参照で記述する、というのが次善の策じゃないでしょうか。

# 以下余談。今回初めて知りましたが、XHTML 側の UA 適合条件はこんな感じです。

ユーザエージェントがその宣言を処理していない (定義済み実体以外の) 実体参照に遭遇した場合 (これはユーザエージェントがまだ読んでいない外部サブセットの中に宣言がある場合に起こりうる)、その実体参照は、その実体参照を作り上げている (アンパサンドで始まりセミコロンで終わる) キャラクタとしてレンダリングされるべきである。

XHTML 1.0 でも M12N でもこうなんですが、これはちょっと非 XML 的で、あまりよい定義ではないですね。この書き方だと外部実体を読むプロセサを持つ UA でも未知の実体参照をレンダリングすべきということになりますし。プロセサのエラー処理にまで影響を及ぼしかねないのはどうなんでしょう。前述の四つの UA の中の人たちも、HTML ならいざ知らず、さすがに XHTML にこういう処理を持ち込もうとは考えもしなかったんじゃないかしらん。

2005-12-22: HTML 4.01 の datetime の値

HTML 4.01 の datetime 属性は時分秒まで書かなければいけないのかというおはなし。例によって仕様書を参照 (HTML 4.01 (日本語訳) 6.11 日付と時刻)。

[ISO8601] では、日付と時刻の表現に関して、多くのオプションとバリエーションが認められている。本仕様のこの版では、プロファイル [DATETIME] で記述される一つの形式のみを正当な日付/時刻文字列として採用した。(DTD では %Datetime; と表す。)

で、具体的にその一つの形式YYYY-MM-DDThh:mm:ssTZDとしているわけです。ということで、HTML 4.01 の datetime 属性では時分秒及びタイムゾーンまで常に記述する必要があります。

もっとも、続いて註記があるように日付時刻文字列を生成するアプリケーションが秒数を取得できない場合、秒の値を「00」として構わない。(分や時間についても、必要であれば「00」としてよい。)ということなので、時刻を書くのが面倒なら便宜上 2005-12-22T00:00:00+09:00 のように記述すれば問題ないと思います。

# エディタのツールで時刻まで挿入できるようにしておくと便利です、というのも一応書いておこう……。

ちなみに Modularization of XHTML™ 1.0 SE 草案C.2.2. XHTML Datatypes でも、データ型 Datatime は XML Schema の dateTime です。もっとも XML Schema の dateTime'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?なので、小数秒を書くことができたり、タイムゾーンが省略可能だったりしますが。

# 2005-12-23 追記

神崎さんに対応していただきました。多謝。

2005-12-24: Re: XHTML 1.0 関係者に 20 の質問

一応律儀に全ての質問に答えてみたのですが、ちょっと冗長なので先に要点だけまとめておきます。なお、多くは「そう言われたらこう返したくなる」式の揚げ足取りで、必ずしも僕自身の考えではありません ;)

Q. text/html で提供するのに HTML 4.01 でなく XHTML 1.0 を用いる理由は?

A. ひとえに、XHTML 1.0 が XML 互換だからです。文書作成やその後の編集作業、あるいは再利用等を XML アプリケーションを用いて行えるのは、HTML 4.01 にはない XHTML 1.0 の利点です。

Q. XHTML 1.0 を提供するのに text/html を用いる理由は?

A. 旧来の HTML UA との互換性のためです。

Q. XHTML 1.0 は XML なのだから、XML プロセサを内蔵していない UA では解釈できないのが当然では?

A. XHTML 1.0 は旧来の HTML と互換性を持てるように設計されていますので、互換性ガイドラインに従って作成された XHTML 1.0 文書は HTML UA で解釈できて当然じゃないでしょうか。

それにしても、XHTML 1.1 よりも XHTML 1.0 が推奨されてるなんて話はいったいどこから来たんですかね。おそらく、W3C が言うところの Latest Version of HTML: http://www.w3.org/TR/htmlが XHTML 1.0 であって XHTML 1.1 でない、という話がこう飛躍したのだと思いますが、これは (真名垣さん自身が繰り返し述べているように) 単に XHTML 1.1 が HTML と非互換であるという理由によるものでしょう。

XHTML 1.0 は HTML でありうるけれども、XHTML 1.1 は HTML ではない (あくまで XHTML である)、というのが W3C の基本的な姿勢らしいというのは、いろんなところで言われていることです。

一応、以下に全回答を載せておきます。

何故 XHTML 1.1 が未だに W3C の推奨規格となっていないの?

W3C Recommendation 31 May 2001 とある通り、XHTML 1.1 は 2001-05-31 に W3C の推奨規格になっています。

XHTML 1.0 が推奨されているみたいだけど、「XML 適合になれば便利だ」風の意識から勧告された XHTML なのに、何故何時までも HTML との互換性に拘る訳?

XHTML は HTML が XML 適合になれば便利だ、という動機で策定されたものだと思いますので、HTML との互換性にこだわる人がいるのは当然じゃないでしょうか。

旧来の HTML との互換性を考慮して text/html で XHTML 1.0 準拠の文書を公開して、何か良い点はあるの?

旧来の HTML UA でも解釈可能であることは利点でしょうね。

旧来の HTML との互換性を考慮した XHTML 文書と、今までの HTML 文書の間に何の差があるの

後者は XML 適合ですが前者は違います。

XML 宣言が書かれて、空要素が閉じられて、要素名が小文字になって、引用符が必須になって……そういう「記述規則」を守って XHTML 1.0 に準拠しても、まるで HTML 4.01 準拠と変わらないんじゃないの?

XML か否かというのは極めて大きな違いだと思いますが。

何か XHTML の「規則」に従っただけの HTML 文書を生成して変わった事とかはあるの?

XML プロセサでの解析が可能になりました。

text/html で送信される XHTML 文書なんて、どうせ XML パーサは処理しないんでしょ?

リモートではそうでしょう。もっとも、ローカルでは XML プロセサを使って処理している人もいるでしょうし、特に制作者でそういう人は多いと思いますが。

それを処理するのは単なる HTML パーサでしょ?

前記の回答を参照してください。

なら最初から HTML 4.01 に準拠すれば良いんじゃないの?

XHTML 1.0 に比較して、HTML 4.01 に準拠する利点が感じられません。

HTML 文書として処理される事くらいは分かっているんでしょ?

前記の回答を参照してください。

だとしたらあえて XHTML を採用する理由とか必然性は何処にあるの?

そもそも、あえて HTML 4.01 を採用する必然性はどこにあるんでしょうか。

HTML 文書として送信されて HTML 文書として解釈される事なんて自明なのに中身は XHTML 準拠となっている、そういう矛盾を孕んだ文書を何故生成するの?

HTML にも XHTML (の構文) にも準拠していることのどこら辺が矛盾なんでしょうか。

旧来の HTML との互換性を配慮するのは良いけど、そうした XHTML 文書が XHTML 文書として処理される事はないよ?

前記の通り、リモートではそうでしょう。

旧来の HTML との互換性を配慮しつつも、XHTML 文書として処理される、と云う風な感じで XHTML 文書を公開するのなら話は分かるよ?

そういうのは文字通りの XHTML の担当でしょうね。

でも実際にそう遣って公開しているの?

そうやって公開しているリソースもありますね。

text/html で送信するなら XHTML に準拠する価値は皆無なのだから HTML 4.01 にでも準拠すれば良いし、XHTML に準拠するのなら application/xhtml+xmlapplication/xmltext/xml で送信するべきではないの?

前記の通り、XHTML であればローカルで様々な利点を享受できますので、そのような利点を拒否して HTML 4.01 に準拠する必然性は感じません。

それはそうと、XHTML に準拠するなら送信すべき MIME は application/xhtml+xml でしょう。深くは突っ込みませんが。

ruby 要素を使いたいから XHTML 1.1 に準拠するけど、でも旧来の HTML との互換性を確保したいから text/html で送信する」と言う人がいるけど、ruby 要素自体が、旧来の HTML との互換性に欠けている云う事に何故気付かないの?

ruby が旧来の HTML と非互換であるというのは、多くの人は知っていると思いますが。そのような人たちが互換性を確保したいと思っているのは、旧来の HTML とではなく旧来の UA とでしょう。

将来XHTML 1.1を利用出来る様な状況になった時、手軽に移行出来る様にする為、XHTML 1.0 に準拠している――若しそうだとしても、XHTML 1.1 と HTML 4.01 の文法は殆ど変わらないから、HTML 4.01 Strict なら軽い一括置換だけで即 XHTML 1.1 に移行出来るよ?

XHTML 1.0 Strict と XHTML 1.1 の文法はほとんど変わりませんから、軽い一括置換で XHTML 1.1 に移行することもできます。付け加えるなら、XHTML 1.0 Strict の場合は XSLT でそういう作業を行うこともできますが、HTML 4.01 Strict の場合はそういうわけにはいきません。

XHTML が XML 適合となって、原則として対象が XML パーサとなった以上、XML パーサを持っていない、或いは不完全な XML パーサしか持っていない UA で処理出来ないのは、至極当然の事なんじゃないの?

どのレベルでの話かはともかく、おおむねその通りだと思います。

もっとも、そもそも HTML UA というのは本質的には SGML パーサを内蔵しているもので、SGML パーサというのはある程度 XML プロセサと互換性を持つものです。したがって、非互換である部分を排除した形式で文書を作成すれば、HTML UA で XHTML 文書を処理することも当然可能でしょう。

纏めると、旧来の HTML との互換性を考慮して、HTML としてしか処理されない様な形態 (text/html) で XHTML 文書を公開するくらいなら最初から HTML に準拠すれば良いし、XML 適合になった XHTML が良いなら、XHTML 文書として処理される様な形態 (application/xhtml+xmlapplication/xmltext/xml) で公開するのが筋じゃないの?

前記の通り、前半はメリット・デメリットを考慮して制作者がおのおの決定すべきことでしょう。

後半はその通りだと思います (まあ、text/xml はどうかな)。

この文書について

URI
http://www.satoshii.org/markup/notes/2005/12
初版
2005-12-21
最終更新
2006-02-05
著者
石川哲志
Copyright © 2005, 2006 Satoshi ISHIKAWA, All Rights Reserved.