XMLでの実体参照

ブックバークに書いたコメントに他のコメントでコメントが付いていたので*1、昔遭遇した事態をメモしておくことに。
SGMLでは文字実体参照というのがあってこれでだいたい外字みたいなのを全て処理していたのですが、実のところXMLではこれは全て文字コードを指定する数値実体参照になってしまっているようなのです。より正確には、「XMLスキーマ*2を使ってXML技術らしくXMLを定義しようとすると、それしか使えなかった」ということでしょうか。
何が問題かというと・・・UTF-8とかで定義されていない文字が使えないし、そもそも人間が手書きでかけるものでなくなってしまう。*3
XMLスキーマなんてそもそも使えないんだ!」と割り切ってSGMLと同じようにDTDを書いていれば使えるのですが、今度はXMLの長所であるネームスペースが使えなくなる。結局、「くそ、XMLなんて大嫌いだぁ」という気分になったのをよく憶えています。
結局のところ、XMLスキーマの規格というのはSOAPみたいなデータ交換のことを念頭に置いていて、通常の「文書」みたいなものを定義しようとするとかなり苦しい。
その辺はRelaxとかの方が良かったという話を聞いていますが、RelaxNGとかの解説書*4ってあんまり見かけないので結局勉強してないのがいけないのかも。でも、手元のシステムにRelaxNGに対応したものがないので勉強してもとりあえず無理だけど。
ちなみに、XML用のDTDを書いていて、パラメータエンティティが使える場面が異常に減っていてさらにへこんだことも憶えています。おかげでSGMLで書いていたDTDをコンバートするのを諦めました。確かDTDのバージョンバップを簡単にするために至る所にパラメーターエンティティーを使用していたのが徒になったのですが、さすがに細かいところは忘れました。
そういえば、実体参照宣言も規則が厳しくなっていてちょっと困った気がしてきた。いや、SGMLの文字実体参照宣言があまりにもノー・ルールだっただけですが。*5

*1:って、偶然気がついただけだけど。

*2:本来、XMLスキーマというのは一般名称なのだと思うのだが、この場合はXMLの規格と同時に発表されたアレ。アレが使いにくいのはMSのせいに違いない(笑)

*3:名前を覚えることは出来ても、文字コードを憶えることはまず出来ないので。むしろこれは、「UTF-8で表せない文字なんてコンピュータで使わないよね」という企画者の考えがあったのかもしれない。

*4:RelaxNGとRelaxは全く別物とも聞くが、発展解消したと聞くので今更Relaxは勉強してはいけないのだろう。

*5:なにしろ、宣言を見ても実際にどんな文字を表示するつもりなのかさっぱり分からないし。