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

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

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

 さて、次は別の例を取り上げる。

A more complex example will illustrate the rules and their effects fully. In the following example, the line numbers are solely for reference.

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


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>

 この複雑怪奇な参照の展開の話題には、もっと複雑な問題が含まれているということである。次の文章の行番号は説明の都合上付いているだけで、本当は記述されていないものであるということである。その点に留意して読み進めていただきたい。

 次は、上記のXML文書を処理した場合について説明している。

This produces the following:

  • in line 4, the reference to character 37 is expanded immediately, and the parameter entity "xx" is stored in the symbol table with the value "%zz;". Since the replacement text is not rescanned, the reference to parameter entity "zz" is not recognized. (And it would be an error if it were, since "zz" is not yet declared.)
  • in line 5, the character reference "&#60;" is expanded immediately and the parameter entity "zz" is stored with the replacement text "<!ENTITY tricky "error-prone" >", which is a well-formed entity declaration.
  • in line 6, the reference to "xx" is recognized, and the replacement text of "xx" (namely "%zz;") is parsed. The reference to "zz" is recognized in its turn, and its replacement text ("<!ENTITY tricky "error-prone" >") is parsed. The general entity "tricky" has now been declared, with the replacement text "error-prone".
  • in line 8, the reference to the general entity "tricky" is recognized, and it is expanded, so the full content of the test element is the self-describing (and ungrammatical) string This sample shows a error-prone method.

これを処理すると、次のとおりとなる。

  • 4行目で、37番の文字への参照を直ちに展開し、パラメタ実体"xx"を、シンボルテーブルに"%zz;"という値とともに保存する。置換テキストを再び走査することはないので、パラメタ実体"zz"への参照は認識しない("zz"は、まだ宣言されていないので、走査されれば誤りとなる)。
  • 5行目で、文字参照"&#60;"を直ちに展開し、パラメタ実体"zz"を"<!ENTITY tricky "error-prone" >"という置換テキストとともに保存し、これは、整形式の実体宣言になる。
  • 6行目で、"xx"への参照を認識し、"xx"の置換テキスト(すなわち、"%zz;")を構文解析する。"zz"への参照を続いて認識し、置換テキスト("<!ENTITY tricky "error-prone" >")を構文解析する。一般実体"tricky"は、この時点で宣言され、その置換テキストは"error-prone"になる。
  • 8行目で、一般実体"tricky"への参照を認識し、展開し、要素"test"の完全な内容は、次のThis sample shows a error-prone method. という自己記述的な(非文法的な)文字列となる。

 冒頭の文章は、このXML文書が処理された場合の手順が、以下に示されているということである。以下の手順は4段階に分かれて説明されている。この4つの段階には特に番号などは付いていないが、JIS X 4159ではa〜dまでのアルファベットが付されている。これは文書の作成ルールの要請により付加されたもので、本質的に重要ではない。

 では、早速順番に読んでいこう。最初の項目である。4行目は、パラメタ実体xxの宣言である。パラメタ実体xxの値は、「%zz;」なのだが、「%」は文字参照を用いて宣言されている。しかし、文字参照は即座に構文解析され展開されるので、パラメタ実体xxの値は「%zz;」となる。次は、これはパラメタ実体zzへの参照ではなく、単なる「%zz;」という文字列と認識される。しかし、永遠にパラメタ実体zzの参照として認識されることがない、という意味ではない。パラメタ実体xxがDTD内部で参照されれば、これはパラメタ実体zzの参照と解釈されることがあり得るのである。つまり、4行目の段階では認識しないというだけの話である。最後の文章は「走査されれば」という仮定の文章であるが、実際にはこの段階では「走査されない」のでエラーにならない。

 次は2番目の項目である。5行目はパラメタ実体zzの宣言であるが、その値はというと、実体の宣言そのものである。「&#60;」は、「<」に置き換えられるので、まさに実体宣言となる。しかし、この行では実体を宣言する機能は発揮しない。実体の値は、参照されねば効力を発揮しないのである。

 次は3番目の項目である。6行目はパラメタ実体xxへの参照が記述されているが、もちろんこれはパラメタ実体の参照として認識される。そして、置換テキストが構文解析される。つまり、パラメタ実体xxの値である「%zz;」が構文解析される。次に、「%zz;」は単なる文字列ではなく、パラメタ実体zzへの参照であると認識される。そこで、置換テキストとなるパラメタ実体zzの値である上記文字列を構文解析し、その結果がパラメタ実体xxへの参照と置き換えられる。つまり、まさに6行目は実体宣言そのものに置き換わるのである。しかし、まだ話は終わらない。パラメタ実体を置き換えた後、その行はDTDの合法的な一部として処理されるのである。そのことが、次に表現されている。つまり、この行は結果としてtrickyという実体を宣言しているのである。

 次は最後の項目である。8行目はDTD外の通常の本文となるわけだが、そこに含まれる「&tricky;」は一般実体参照として認識され、4〜6行目の宣言により定義された値「error-prone」に置き換えられる。つまり、以下のように参照が置換される。

This sample shows a &tricky; method.
   ↓
This sample shows a error-prone method.

 ちなみに、「self-describing (and ungrammatical) string」、「自己記述的な(非文法的な)文字列」とはいったい何だろうか。おそらく、言葉の見掛けほど深い意味は存在しないのではないかと思う。self-describing=自己記述的とは、つまり間接的な参照などを含んでいないことを意味しているのだろう。つまり、文字列の中に、それを表現する文字がすべて含まれているということである(参照を含む文字列はそうではない)。そして、ungrammatical=非文法的というのは、それがXMLなどで規定する文法による構文解析の対象にならないことを示しているのではないかと思う。つまり、もう文法に従う存在ではないということである。

 以上で、「C XML and SGML(Non-Normative)」と「D Expansion of Entity and Character References(Non-Normative)」を読み切った。JIS X 4159では「附属書C(参考)XMLおよびSGML」と「附属書D(参考)実体参照および文字参照の展開」である。前者は好奇心と歴史への敬意によって読まれるものではないかと思うが、後者はXMLそのものの知識を深めるために有益な情報といえる。DTDが利用される機会は減っており、複雑な参照の展開を解釈する必要性は薄くなっているかもしれないが、世の中にDTDを活用した高度な応用事例があるかぎり、無用の知識にはならないだろう。

 さて、次回は「E Deterministic Content Models (Non-Normative)」、JIS X 4159では「附属書E(参考)決定的内容モデル」を読んでいこう。内容モデルとは要素内容に記述できる子要素などの制約を記述したものだが、それは決定的でなければならないことを説明している。決定的であるとは、複数の選択肢があるとき、先読みせずともどれであるかが分かることを意味する。それが重要な意味を持つことは、特に実装の手間を考えると見えてくる。そのあたりも踏まえ、なぜXMLの内容モデルは決定的でなければならないのか、考えてみよう。この制約は、多くのXML利用者の使い勝手に直結する可能性のある問題である。(次回に続く)

3/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 記事ランキング

本日月間