- 6.1 エンティティ
- 6.2 内部エンティティ
- 6.3 外部エンティティ
- 6.4 エンティティ宣言に関する注意
- 6.5 解析対象外エンティティとNOTATION宣言
- 6.6 パラメーターエンティティ
- 6.7 まとめ
- (参考1) standalone文書
- (参考2) 他のスキーマ言語
(参考1)standalone文書
「2.1 XML宣言」でスタンドアロン文書についての記述しました。外部エンティティについて説明も終えたので、改めてスタンドアロン文書とは何か、ということについて、記述したいと思います。まず、外部マークアップ宣言について説明します。外部マークアップ宣言とは、外部サブセットおよびパラメータエンティティに存在するマークアップ宣言です。パラメータエンティティが内部サブセットで宣言されていたとしても、パラメータエンティティ内で宣言されているマークアップ宣言は、外部マークアップ宣言になります。XMLの仕様では、non-validating(妥当性を検証しない) XML processor はパラメータエンティティを読む必要がありません。つまり、non-validating XMLプロセッサーが読み飛ばす可能性があるマークアップ宣言は全て、外部マークアップ宣言になります。
スタンドアロン文書とは、外部マークアップ宣言の読み込みを行わなくても処理を行えるXML文書の事を指します。以下のような外部マークアップ宣言を含む場合、standalone文書ではありません。
- デフォルトの値をもつ属性
- 実体
- 正規化の対象となる値を持つ属性
- スペースを含む内容を持つ要素
例を以下に示します。
<!xml version="1.0" standalone="yes"> <!DOCTYPE memo SYSTEM "../dtd/memo.dtd" [ <!ENTITY WWW "World Wide Web" > <!ENTITY ISOLat2 SYSTEM "http://www.utj.co.jp/iso.isolat2-xml.entities" > %ISOLat2; ]> <memo author="foo"> 明日、&WWW;についての説明会があります。ご参加ください。 </memo>
上の例では、DTDの外部サブセットと外部エンティティが定義されています。しかし、well-formed XML文書として処理するならば、これら外部の宣言を読み込む必要はありません。このような場合、standalone=yesと設定しておくことにより、XMLパーサは、外部サブセットも外部エンティティも参照せずにXML文書の処理を行います。
また、わかりにくいですが、以下の文書もstandalone文書と宣言することができます。例を以下に示します。
<!xml version="1.0" standalone="yes"> <!DOCTYPE memo SYSTEM "../dtd/memo.dtd" [ <!ENTITY chap1 SYSTEM "http://www.utj.co.jp/doc/chap1"> <!ENTITY chap2 SYSTEM "http://www.utj.co.jp/doc/chap2"> ]> <memo author="foo"> &chap1; &chap2; </memo>
上の文書を受け取ったXMLパーサはstandalone=yesと設定されていることから、DTDの外部サブセットは読み込みません。ただし、上記例では、外部エンティティへの参照が含まれています。XMLパーサは内部サブセットに定義されている外部エンティティを展開します。この例よりもわかるとおり、スタンドアロン文書であっても全く外部のファイルの参照を行わない、ということではありません。外部サブセットの参照が不要な場合にXMLパーサにそれを知らせ、冗長な処理を省くためにスタンドアローン宣言を行う、と理解できます。