TOP > プログラマ2.0日報 > 「実体」の実態は?

あすなろBlogger

facebookに投稿 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク このエントリーをはてなブックマークに追加 この記事をクリップ! livedoorclip ユーザー数 BuzzurlにブックマークBuzzurlにブックマーク この記事をtweetする

「実体」の実態は?

2008.12.22

冗語風な言い回しって好きですね私。

結構これ前から気になっていたのですが、少し調べたんです。その問題とはですね、

何でXML では実体参照で他のファイルをXMLに取り込めるのに、XML であるはずのXHTML ではそれができないか?

ということです。たまにあるんですよねこういうXML(James設定ファイルより)。

<?xml version="1.0"?>
<!DOCTYPE config [
<!ENTITY fetchmailConfig SYSTEM "../conf/james-fetchmail.xml">
]>

<config>
    .... 略
    &fetchmailConfig;

こうすると、&fetchmailConfig の位置に、../conf/james-fetchmail.xml の内容が展開されるので、

ファイルを分割して管理できる

というメリットが生まれるわけです。しかし、XHTML 自体では、

何か別のファイルをインクルードしたり、変数のように断片を扱って引用して使う

ということができないわけです(勿論 JSP とかvelocity とかテンプレート系ツールを使えば別)。

まあ、XHTML でできない理由....というと、これは XML 文法面での問題がかなり大きいです。XHTML では実質上

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">

と DOCTYPE宣言をすることが求められますが、 エンティティ定義は DOCTYPE 宣言の中に書かなくてはなりませんし、しかも

DOCTYPE 宣言は1XMLファイルに1つしか宣言できない(アタリ前)

なので、実質上

断片を管理するためのエンティティの宣言ができない

からやりようがない、という結論になります。

.....じゃあ、逆に、

XHTML がバージョンアップするとかして、エンティティのような断片管理ができるようになる...可能性があるか?

というと、これもどうやらキビシイようです。というのは、

ブラウザの2つの顔?

という面白い問題があるようなのですね。

IEだとかFirefox だとか Opera だとか、皆知ってるブラウザはいうまでもなく、

もともと(SGML風な言語である) HTML ブラウザだった

わけです。しかし HTML の XML 化されたバージョンである XHTML が(それなりに)普及したことで、事後的に

(SGML風な)HTMLブラウザであり、かつ XML ベースのXHTMLブラウザだから、XMLブラウザでもある...

というモノに変化していきました。ですから、この3つのフォーマットを取り扱うことができるのですけども、論理的には

XML⊃XHTML

であっても、

XML ブラウザ機能が拡張されて、XHTML ブラウザになっているわけではない!

という事情があるのです。これは、

XML の規約に(うっかり)反したタダの XML 文書は、違反文書だとして却下すればいいが、XML規約にうっかり反した XHTML文書でも、とにかく表示できなければ、デタラメな HTML が表示できている現状と整合性が取れない

というオトナな現実もあります。(確認:→error.xml.html は</body></html>を落としているから、XML宣言してても well-formed ではないが、それでも XML としてエラーという扱いにならずに、レンダリングが強行されます...お試しあれ)

 で、さらに、そういう

XHTML「も」解釈できる HTML ブラウザとしてのブラウザ

は、

(典型的な)妥当性検証を行わないユーザエージェント(この用語は「XHTML1.0: 拡張可能ハイパーテキストマークアップ言語3.2 ユーザエージェントの適合性による)

なので、実は、

DTD の URL が DOCTYPE 宣言に書かれていても、URL から DTD を入手して合わせて記述を検証する必要はまったくない

ために、XHTML 規約で決まっている範囲のエンティティ(要するにHTML4とまったく同じ)をレンダリングすればいいだけ

ということになります.....(結構ショック?)

XHTMLブラウザから見た XML宣言とかDTD とかは、

単なる飾り(極論)

に過ぎなかったりするのですね(少し悲しい)。

逆に、Well-formed な XHTML を、XHTMLブラウザの XML ブラウザモードでブラウズさせる(言い方ややこしいですが、要するに拡張子 .xml でちゃんと表示する XHTML を表示してみる)と、

使っているエンティティによって、ブラウザによって動作が違う

なんてことになります。要するに、&amp; &lt; &gt; &quot; &apos; の5つのエンティティは、XML 規約で決まっているモノなので、

DTDで宣言があろうとなかろうと、常にちゃんとレンダリングされる

わけですが、XHTML で(というか、HTML4で)決まっているエンティティ(&copy;とか)は、

DTD に定義がある

ということになります。なので、今回は「XMLブラウザ」なので、宣言されているDTDを見にいかなくてはならず、

http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd

を取りに行ってレンダリングをするのですが、IEはその解釈に失敗するようです(結構情けない)....しかも、面白いことに、CSS なしのタダの XML なのに、Firefox では <table> タグとかを、HTML のジョーシキに従ってレンダリングしてしまいます(IEはタダのXMLとして表示します)。

あれ~と思って、いろいろやってみましたが、どうやら、Firefox では、

<html xmlns="http://www.w3.org/1999/xhtml"> 要素の中にあることで、HTML流レンダリングのスイッチが入る

という格好のようです。理屈じゃないようです....結論、としてまとめるとするならば、

XHTML は XML かもしれないが、XML だと思ってはいけない!

という(アタリマエな)結論になるようです....(参考「XHTML と実体参照」)

XML 方面の主流は「実体は極力使わないようにしよう」という方向に進んでいます

 要するに外部参照まで面倒見ることにすると、検証が大変過ぎることになるケースが多いのがイヤがられてるようですね。ふう....

投稿者 : 杉浦 こずえ | 投稿日時 : 2008.12.22 22:01

あすなろBLOGのトラックバック・コメントは承認制になっています。
すぐにブログに反映されませんので、ご了承ください。

トラックバックURL


コメントの送信








カレンダー

<< 2008年12月 >>

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

最新のエントリー

最新のトラックバック

最新のコメント

Tag

バックナンバー