「実体」の実態は?
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 を表示してみる)と、
使っているエンティティによって、ブラウザによって動作が違う
なんてことになります。要するに、& < > " ' の5つのエンティティは、XML 規約で決まっているモノなので、
DTDで宣言があろうとなかろうと、常にちゃんとレンダリングされる
わけですが、XHTML で(というか、HTML4で)決まっているエンティティ(©とか)は、
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のトラックバック・コメントは承認制になっています。
すぐにブログに反映されませんので、ご了承ください。





