2009年5月3日日曜日

SGML Catalog

4月20日のエントリで書いた通り、SGMLをパースするにはDTDは必須であり、DTDが指定されなければ文書構造すら解釈が複数生じ、どれが正しいか決定できない。しかし実際問題として、文書型宣言中のシステム識別子で指定されたURLからDTDが取得できないことは頻繁にあり得る。例えば、W3Cのサイトがダウンしていたら http://www.w3.org/TR/html4/loose.dtd は取得できず、その間 HTML 4.01 Transitional の文書は(SGML的には)パースできないことになってしまう。

これはSGML界隈で広く知られていた問題のようで、OASISからこの問題の技術的解決策が提案されている(OASIS Technical Resolution 9401:1997 (Amendment 2 to TR 9401), "Entity Management")。正式名称かどうかは分からないが、これを SGML Catalog と呼ぶ(例えば W3C HTML 4.01 Recommendation の19.2節)ようで、私もこの名称は聞いたことがある。

SGML Catalogとはどういうものか。W3C HTML 4.01 Recommendation の19.2節の例を挙げてみる。
OVERRIDE YES

PUBLIC "-//W3C//DTD HTML 4.01//EN" strict.dtd
PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" loose.dtd
PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" frameset.dtd
PUBLIC "-//W3C//ENTITIES Latin1//EN//HTML" HTMLlat1.ent
PUBLIC "-//W3C//ENTITIES Special//EN//HTML" HTMLspecial.ent
PUBLIC "-//W3C//ENTITIES Symbols//EN//HTML" HTMLsymbol.ent
例えば2行目は、公開識別子 PUBLIC "-//W3C//DTD HTML 4.01//EN" のDTDとして、URL "strict.dtd" (つまり、そのHTML文書と同じディレクトリに置かれている strict.dtd ファイル)が使えることを表している。この例では PUBLIC についてのみ指定されているが、SGML DTDで用いられる実体の多くについてこのような指定ができるようになっている。HTML 4.01の3種類のDTD以外にも指定されているのは、HTML 4.01 DTD内部でこれらの外部エンティティを参照しているからだ。具体的には、äといった実体の宣言がこれらの外部エンティティに含まれている。

1行目の OVERRIDE YES は、SGML文書中にシステム識別子が書かれていても、以下(この場合は2行目以降)のカタログエントリを優先して処理せよ、という指定である。この例では、HTML文書の文書型宣言で PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" と指定されていても、同じディレクトリ中の loose.dtd ファイルを優先して使うことになる。システム識別子が省略されていても同様である。

私が知っている実体管理の手法は SGML Catalog だけであるが、これはSGML文書の相互運用性(interoperability)の上で重要な問題であるので、OASISで正式に提案が成立するまでの間、各種ベンダーが独自に解決策を実装していたであろう、ということは想像に難くない。SGML規格書9.1.6節「外部識別子」にある以下の記述は、SGML Catalogや各種ベンダーの独自解決策をひっくるめて指していると思われる。
システム識別子は,公開識別子及びその他の情報からシステムが補充できるのであれば,省略してもよい。
ただし、もちろんのことながら、すべてのSGML処理系がSGML Catalogや同等の解決策を実装しているわけではないだろう。したがって、相互運用性をできるだけ広く確保するのを優先するならば、公開識別子があってもシステム識別子を省略すべきではない。…というのが、Okitaさんの記事にある「後半部の“http://www.w3.org/TR/html4/loose.dtd”は省略してもよい」かどうか、に対する、純粋にSGMLの視点から見た結論である。

ただ、この結論が「WWWページ記述言語としてのHTML」にそのまま適用できるか、は、もう少し考えなければならないような気がしている。調べているうちに興味深いことが分かったので、稿を改めて書いてみることにしたい。