第2回 『 standalone="yes" / "no" 』

第2回 『 standalone="yes" / "no" 』

XMLは、DTDを用いて妥当性の検証を行うことができます。XML文書に文書型宣言()を記述し、XMLプロセッサで妥当性の検証を行います。

妥当性の検証を行う場合XMLプロセッサは、XML文書と、内部・外部を問わずすべてのDTDを読み込むことによって妥当性の検証を行います。

妥当性の検証を行わないXMLプロセッサ(非検証XMLプロセッサ)がDTDを全く読み込まないというのは誤りで、一部のDTDを読み込むことが義務付けられています。一部とは、パラメータ実体を除いた内部サブセットDTDです。非検証XMLプロセッサは、(内部・外部を問わない)パラメータ実体と外部サブセットDTD(ここではこれらを外部リソースと呼びます)を読み込んでもよいし、読み込まなくても構いません。

それでは非検証XMLプロセッサは、一部またはすべてのDTDを読み込んで何をするのでしょうか。それは実体宣言により内部実体を解決し、属性リスト宣言から属性の型を読み取り(属性値の正規化に影響します)、またデフォルトの属性値を与えます。

このようなXMLインスタンスに影響を与えるDTDの宣言が、外部リソースに出現しないことを意図的に宣言できるのが、XML宣言部に記述する「standalone="yes"」です。これによりXMLインスタンスを処理する際に、妥当性の検証を行わないのであれば外部リソースを無視できるといったメリットが生まれます。

ところが実際に外部リソースにそのような宣言がない場合であっても、「standalone="yes"」と記述し、そして外部サブセットDTDにより妥当性の検証を行った場合、ひとつ厄介な問題があります。それは次のような妥当性制約が定義されている点です。

◆定義されている妥当性制約
外部リソースで要素内容(子要素のみを含み文字データを含まない)として宣言されている要素が空白文字を含んでいる場合は「standalone="no"」でなくてはならない

つまり「standalone="yes"」と記述した場合、XMLインスタンスにインデントなどの無意味な空白が含まれた場合は、その点で妥当性検証エラーとなってしまいます。XMLのシリアライズの方法によってはインデントなどが含まれる場合もあり、完全に無意味な空白を排除できないような場合は上記の点が問題となります。

結局この件に関する結論としては、妥当性の検証を必要としないなら、「standalone="yes"」が理想であるが、妥当性の検証を必要とするなら「standalone="no"」が現実的である、といったことになりそうです。

 

日時: 2004年07月15日 00:00 |  | TrackBack

« 1つ前のコラム |XMLノート:コラムの最新リストへ戻る| 1つ後のコラム »

このページのトップ