第36回 XMLとSGMLはどこが違うのか Page 2

川俣 晶
株式会社ピーデー
2005/8/4

実体参照および文字参照の展開

 Appendices(附属書)は1項目ごとに話題の連続性がない。次は、まったく違う話題に進む。「D Expansion of Entity and Character References(Non-Normative)」、JIS X 4159では「附属書D(参考)実体参照および文字参照の展開」とされる個所である。これは、実体参照と文字参照の展開ルールについての補足説明である。Non-Normative=参考と書かれているとおり、規定ではない。では早速読んでいこう。

This appendix contains some examples illustrating the sequence of entity- and character-reference recognition and expansion, as specified in 4.4 XML Processor Treatment of Entities and References.

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

 「4.4 XMLプロセッサによる実体および参照の扱い」については、本連載の第29回「実体を参照する文脈=コンテキスト」と第30回「実体参照における「振る舞い」とは何か」で読んだ。そのときのことを、ちらっと思い出していただきたい。4.4で述べられていた内容は、最初の1文が要約していた。

次の表に、文字参照、実体参照および解析対象外実体の呼び出しが現れる文脈、ならびに、それぞれの場合におけるXMLプロセサに要求される振る舞いを要約する。

 つまり、文字参照、実体参照、解析対象外実体の呼び出しについて、それが出現する文脈、要求される振る舞いという非常に多くの情報を1つの表にまとめて表現したものを提示していたわけである。その表を読むための説明を含め、全体として非常に膨大な情報量となっていた。たかが表1個ではあるが、本連載ではそれを読むために2回を費やした。

 さて、なぜこのような表が必要とされているのかといえば、それは複雑な条件を素早く確実に読み取るためである。ここで規定されている項目の中には、ほかの個所ですでに規定されているものもある。しかし膨大な文章の中から、すべての条件を抜き出し、それを正しく判断することは難しい。見落としなどがあり得る。しかし、1つの表にまとめられていれば、すべての条件と振る舞いを一望でき、見落としはあり得ない。

 しかし、表というフラット(平ら)な形式に押し込められた情報は、効率良く1つに要約されてはいるが、個別のケースでの具体的な動作をイメージしにくいという弊害も持つ。そのような弊害を補うために、ここでは具体的な例を示しているわけである。もちろん、具体的な例は、何かを規定するために存在するわけではなく、より分かりやすくするために用意されたものである。故に、規定ではなく参考となるのが適当だろう。

実体参照および文字参照の展開のサンプル1

 さて、早速具体的な例を見ていこう。

If the DTD contains the declaration

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


<!ENTITY example "<p>An ampersand (&#38;#38;) may be escaped
numerically (&#38;#38;#38;) or with a general entity
(&amp;amp;).</p>" >

 ここでは実体宣言の例が記述されている。この実体は、内部一般実体である。実体の値には、以下のものが含まれている。

  • p要素の開始タグ、終了タグ
  • &#38;#38;という文字参照によって記述された文字参照
  • &#38;#38;#38;という文字参照によって記述された文字参照
  • &amp;amp;という定義済み実体参照によって記述された定義済み実体参照

 ここで注意する必要があるのは、表記の多重置き換えである。例えば「&#38;#38;」という表記は、「&#38;」が文字参照によって表現された「&」であるため、本来は「&#38;」と書きたかったことが分かる。これは、もう一度文字参照の構文であるため、これを解釈するなら、これは「&」になる可能性があり得る。「&#38;#38;#38;」はこれをもう1回繰り返す余地がある。「&amp;amp;」も同じような構造になっている。しかし、このような置き換えは無限に繰り返されるわけではない。それはどこかで終わりを迎える。具体的にどこで終わりを迎え、何回置き換えが行われるかを具体例を通じて見ていくのがここの趣旨である。

 次は、実体宣言(<!ENTITY……>)を構文解析した時点で、これがどう変化するのかを示す。

then the XML processor will recognize the character references when it parses the entity declaration, and resolve them before storing the following string as the value of the entity "example":

XMLプロセサは、実体の宣言を構文解析した時点で文字参照を認識し、これを解決し、実体"example"の値として、次の文字列を保存する。


<p>An ampersand (&#38;) may be escaped
numerically (&#38;#38;) or with a general entity
(&amp;amp;).</p>

 前半では、文字参照は実体の宣言を構文解析した時点で認識されるとしている。つまり、「&#38;」はこの時点で解釈され、「&」に置き換えられる。つまり、以下の置き換えが行われる。

&#38;#38; &#38;

&#38;#38;#38; &#38;#38;

 「&amp;amp;」は文字参照ではないので、この段階での置き換えは発生しない。つまり、変化しない。

 これらの変化を反映した値が、その後に記述されている。文字参照が変化し、定義済み実体参照は変化していないことを確認していただきたい。

 そして文の後半は、これが「example」と名付けられた実体の値になるとしている。つまり、「&example;」のようにしてこの実体を参照する場合、そこで「example」の値として参照されるのは、この値だということである。

 そして、次はまさに「&example;」として参照された場合にどうなるかが例示されている。

A reference in the document to "&example;" will cause the text to be reparsed, at which time the start- and end-tags of the p element will be recognized and the three references will be recognized and expanded, resulting in a p element with the following content (all data, no delimiters or markup):

文書内で"&example;"を参照すると、このテキストは再び構文解析され、このとき、要素"p"の開始タグおよび終了タグを認識し、3つの参照を認識し展開し、その結果、要素"p"は、次の内容(すべてデータであって、区切り子またはマーク付けは存在しない)を持つ。


An ampersand (&) may be escaped
numerically (&#38;) or with a general entity
(&amp;).

 長いので分解して読んでいこう。まず文書内で「&example;」を参照すると、この値は再び構文解析される、というのである。そう、ここで重要なことは、このケースにおいて、実体の値は2回構文解析されるということである。1回目は実体宣言に書かれたときであり、もう1回は参照されるときである。しかし、2回の参照は完全に等価というわけではない。次に、3つの参照を認識し展開し、と書かれているとおり、2つの文字参照と、1つの定義済み実体参照が認識され、展開されている。1回目の構文解析では、定義済み実体参照は処理されなかったが、2回目はそれも処理されている。つまり、以下の置き換えが発生している。

&#38; &

&#38;#38; &#38;

&amp;amp; &amp;

 その結果、全体として、同じように2重の参照に見える「&#38;#38;」と「&amp;amp;」は、このような実体の展開にあっては等価ではないことが分かる。つまり、2回の構文解析を経由した結果は、以下のように同じにならない。

&#38;#38; &

&amp;amp; &amp;

 そして、この後に記述されているのが、2回目の構文解析が終了した後のp要素の内容である。p要素の開始タグと終了タグは含まれていない。また、これは完全にすべての構文解析が完了した後の文字列であって、もはやマーク付けとして解釈されることはないものである(つまり、ここまでの説明文の中で、2重、3重の参照と表現した部分は、厳密な意味で正しくない)。(次ページへ続く)

2/3

 Index
やさしく読む「XML 1.0勧告」 第36回
XMLとSGMLはどこが違うのか
  Page 1
・XMLとSGML、そして実体参照および文字参照の展開
・XMLとSGMLの関係
Page 2
・実体参照および文字参照の展開
・実体参照および文字参照の展開のサンプル1
  Page 3
・実体参照および文字参照の展開のサンプル2


連載 やさしく読む「XML 1.0勧告」


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間