第36回 XMLとSGMLはどこが違うのか Page 3
川俣 晶
株式会社ピーデー
2005/8/4
さて、次は別の例を取り上げる。
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 '%zz;'> 5 <!ENTITY % zz '<!ENTITY tricky "error-prone" >' > 6 %xx; 7 ]> 8 <test>This sample shows a &tricky; method.</test> |
この複雑怪奇な参照の展開の話題には、もっと複雑な問題が含まれているということである。次の文章の行番号は説明の都合上付いているだけで、本当は記述されていないものであるということである。その点に留意して読み進めていただきたい。
次は、上記のXML文書を処理した場合について説明している。
This produces the following:
|
これを処理すると、次のとおりとなる。
|
冒頭の文章は、このXML文書が処理された場合の手順が、以下に示されているということである。以下の手順は4段階に分かれて説明されている。この4つの段階には特に番号などは付いていないが、JIS X 4159ではa〜dまでのアルファベットが付されている。これは文書の作成ルールの要請により付加されたもので、本質的に重要ではない。
では、早速順番に読んでいこう。最初の項目である。4行目は、パラメタ実体xxの宣言である。パラメタ実体xxの値は、「%zz;」なのだが、「%」は文字参照を用いて宣言されている。しかし、文字参照は即座に構文解析され展開されるので、パラメタ実体xxの値は「%zz;」となる。次は、これはパラメタ実体zzへの参照ではなく、単なる「%zz;」という文字列と認識される。しかし、永遠にパラメタ実体zzの参照として認識されることがない、という意味ではない。パラメタ実体xxがDTD内部で参照されれば、これはパラメタ実体zzの参照と解釈されることがあり得るのである。つまり、4行目の段階では認識しないというだけの話である。最後の文章は「走査されれば」という仮定の文章であるが、実際にはこの段階では「走査されない」のでエラーにならない。
次は2番目の項目である。5行目はパラメタ実体zzの宣言であるが、その値はというと、実体の宣言そのものである。「<」は、「<」に置き換えられるので、まさに実体宣言となる。しかし、この行では実体を宣言する機能は発揮しない。実体の値は、参照されねば効力を発揮しないのである。
次は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勧告」 |
- QAフレームワーク:仕様ガイドラインが勧告に昇格 (2005/10/21)
データベースの急速なXML対応に後押しされてか、9月に入って「XQuery」や「XPath」に関係したドラフトが一気に11本も更新された - XML勧告を記述するXMLspecとは何か (2005/10/12)
「XML 1.0勧告」はXMLspec DTDで記述され、XSLTによって生成されている。これはXMLが本当に役立っている具体的な証である - 文字符号化方式にまつわるジレンマ (2005/9/13)
文字符号化方式(UTF-8、シフトJISなど)を自動検出するには、ニワトリと卵の関係にあるジレンマを解消する仕組みが必要となる - XMLキー管理仕様(XKMS 2.0)が勧告に昇格 (2005/8/16)
セキュリティ関連のXML仕様に進展あり。また、日本発の新しいXMLソフトウェアアーキテクチャ「xfy technology」の詳細も紹介する
|
|