附属書D (参考) 実体参照及び文字参照の展開

この附属書は,4.4 (XMLプロセサによる実体及び参照の扱い)で規定されている,実体参照及び文字参照を認識し展開する一連の流れを例によって示す。

DTDが,次の宣言を含む場合を考える。

<!ENTITY example "<p>An ampersand (&#38;#38;) may be escaped
numerically (&#38;#38;#38;) or with a general entity
(&amp;amp;).</p>" >
XMLプロセサは,実体の宣言を構文解析した時点で文字参照を認識し,これを解決する。実体"example"の値として,次の文字列を保存する。
<p>An ampersand (&#38;) may be escaped
numerically (&#38;#38;) or with a general entity
(&amp;amp;).</p>
文書内で"&example;"を参照すると,このテキストは再び構文解析される。このとき,要素"p"の開始タグ及び終了タグを認識し,三つの参照を認識し展開する。その結果,要素"p"は,次の内容(すべてデータであって,区切り子又はマーク付けは存在しない。)をもつ。
An ampersand (&) may be escaped
numerically (&#38;) or with a general entity
(&amp;).

規則及びその効果をより詳細に示すため,さらに複雑な例を示す。次の例で,行番号は参照の便宜のためだけに付ける。

1 <?xml version='1.0'?>
2 <!DOCTYPE test [
3 <!ELEMENT test (#PCDATA) >
4 <!ENTITY % xx '&#37;zz;'>
5 <!ENTITY % zz '&#60;!ENTITY tricky "error-prone" >' >
6 %xx;
7 ]>
8 <test>This sample shows a &tricky; method.</test>
これを処理すると,次のとおりとなる。

 a) 

4行目で,37番の文字への参照を直ちに展開し,パラメタ実体"xx"を,シンボルテーブルに"%zz;"という値とともに保存する。置換テキストを再び走査することはないので,パラメタ実体"zz"への参照は認識しない。"zz"は,まだ宣言されていないので,走査されれば誤りとなる。

 b) 

5行目で,文字参照"&#60;"を直ちに展開し,パラメタ実体"zz"を"<!ENTITY tricky "error-prone" >"という置換テキストとともに保存する。これは,整形式の実体宣言になる。

 c) 

6行目で,"xx"への参照を認識し,"xx"の置換テキスト(すなわち,"%zz;")を構文解析する。"zz"への参照を続いて認識し,置換テキスト("<!ENTITY tricky "error-prone" >")を構文解析する。一般実体"tricky"は,この時点で宣言され,その置換テキストは"error-prone"になる。

 d) 

8行目で,一般実体"tricky"への参照を認識し,展開する。要素"test"の完全な内容は,次の自己記述的な(非文法的な)文字列となる。つまり,This sample shows a error-prone method.