#?SuikaWiki/0.9 [1] [[XML]] の[[実体参照]]をどう扱うかについて。 (仕様書の の辺り。) [2] ,種類 ,パラ ,内解 ,外解 ,外非 ,文字 ,内容中の参照 ,認知されない,取込む,[WEAK[妥当性を検証するなら]]取込む,禁止,取込む ,属性値中の参照 ,認知されない,表記中に取込む,禁止,==,取込む ,属性値として出現,認知されない,禁止,==,通知,認知されない ,実体値中の参照 ,表記中に取込む,処理しない,==,誤り ,取込む ,DTD 中の参照 ,PE として取込む,禁止,==,==,禁止 :パラ :[[パラメーター実体]] (内部又は外部の解析実体。) :内解 :内部[[一般解析実体]] :外解 :外部一般解析実体 :外非 :外部[[非解析実体]] (一般実体。) :内容中の参照:[[要素]]の[[開始タグ]]と[[終了タグ]]の間の参照。 :属性値中の参照:[[開始タグ]]中の[[属性値]]指定又は[[属性並び宣言]]中の既定値宣言の中の参照。 :属性値として出現:型が [CODE(XML)[[[ENTITY]]]] 又は [CODE(XML)[[[ENTITIES]]]]である属性値。 (実体参照ではない。名前そのもの。) :実体値中の参照:[[実体宣言]]の値指定中の参照。 :DTD 中の参照:[[DTD]] 中の適切な場所での参照。但し、「属性値中の参照」, 「実体値中の参照」に該当するものを除く。また、 [CODE(XML)[[[IGNORE]]]] 区間内の参照 [WEAK[(に見えるもの)]] は解釈されない。 - [21] 同じ名前の実体が複数回宣言されている場合、''最初の宣言''が採用され、あとは無視されます。 - [22] >>21 の場合、[[利用者の任意選択により]]、 XML 処理系はそのことを報告しても構いません。 - [23] 直接又は間接に同じ実体を参照することはできません。 (整形式制約) - [31] 妥当性を検証しないので外部解析実体を読まない処理系は、''最初に読んでいない外部パラメーター実体への参照が出てきたところの前まで''内部部分集合を処理しないといけません。 [CODE(XML)[[[standalone="yes"]] の時には、その後の[[要素型宣言]]や[[属性並び宣言]]も処理しなければなりません。そうでないときは逆に処理してはなりません。 [[#comment]] *取り込む included [4] ある[[実体]]の[[置換文]]が取り出されて処理され、 参照のある場所にそれがそもそも存在していたようにされる時、 これを実体を[DFN[取り込む]]といいます。 置換文は文字データやマークなどを含むことが出来て、 普通の方法で処理されます。 文字参照はその参照の場所で指示された文字が処理される時取り込まれます。 例えば、 [SAMP(XML)[]] ... [SAMP(XML)[

昔々あるところに、&ATandT; という(ry

]] 文書片で、 [SAMP(XML)[p]] 要素の内容は [SAMP[昔々あるところに、AT&T という(ry]] になります。 - [5] [DFN[妥当性を検証するなら取り込む]]: 外部解析実体は、[[妥当性を検証する処理系]]は必ず読んで処理しなければなりませんが、検証しない処理系は必ずしもそうとは限りません。 - [6] また、 >>5 の場合、応用によっては、例えば文書閲覧ソフトウェアでは、最初に参照を展開しておくのではなく、利用者の要求があった時点でそれを処理するという使い方もできる、と XML の仕様書は言っています。 - [7] >>5 妥当性を検証しなくて「含まれる」実体を含めなかった場合でも、処理系はそのことを応用に知らせるように、と XML 仕様書は要求しています。 [[#comment]] * 表記中に取込む [9] 実体参照が属性値表記中に出現する時、 或いはパラメーター実体参照が表記実体値中に出現する時、 その置換文はその参照の代わりに、 参照が認知された場所に最初から文書の一部として存在していたように処理します。 但し、置換文中の一重又は二重引用符は常に普通のデータ文字として扱い、 表記の終端とはしません。 [10] XML の仕様書の >>9 の説明はちょっと分かりにくいです。 SGML にいい例があります ([[JISX4151]]‐1992 6.2.2)。 [PRE[ ]PRE] - [20] 属性値の場合は、[[属性値//正規化]]が絡んでやや複雑になりますから、注意が必要です。 - [25] DTD の内部部分集合では使えません (整形式制約)。 >>24 [[#comment]] *PE として取り込む [13] DTD 中のパラメーター実体 (実体値中を除く。) は、妥当性を検証するなら取込みます。 この時、置換文の最初と最後に [CODE(char)[[[SP]]]] が付加されます。 [14] 例えば、 [PRE[ ]PRE] は意図したように ([SAMP(XML)[]] として) 解釈されます。 - [18] この規則 ([CODE(char)[SP]] を補う) って、 SGML にはないですよね? 確かに >>14 のような記述は SGML でも妥当ですが、それはそもそもそう定義されているからであって、間隔が補われるからではないですよね。 - [19] >>18 SGML では構文規則 [CODE(SGML)[[[ps]]]], [CODE(SGML)[[[ds]]]] でほぼ (完全にではないけど) [[引数実体参照]]の出現可能な場所を構文上明示しているけど、 XML ではそれをやってない関係なのかなあ。 - [24] DTD の内部部分集合では、パラメーター実体参照は[[マーク宣言]]の内側では使えません。 (SGML でいう [CODE(SGML)[ps]] にしか書けません。) (整形式制約 ) - [30] >>24 の制限は外部部分集合や外部解析実体では存在しません。 [[#comment]] *処理しない bypassed [12] 実体値中の内部解析一般実体への参照は、 処理されずにそのまま素通りします。 実際にその参照を含む実体が参照された時に参照された場所で解決されます。 [PRE[ ... &ka; ]PRE] [SAMP(XML)[foo]] 要素の内容は [SAMP[[VAR[ka]]]] で、参照を解いて [SAMP[K[VAR[a]]]], まだ参照があるので解いて [SAMP[KA]], 参照がなくなったのでこれが最終的な内容になります。 [PRE[ ... AN &outer; ELEMENT ]PRE] この例で [SAMP(XML)[foo]] の内容は意図したとおり [SAMP[AN AN - an & entity -- ENTITY ELEMENT]] になります。 うっかり気を遣って [SAMP(XML)[]] としてしまうと、本当に [SAMP[AN AN - an & entity -- ENTITY ELEMENT]] になってしまいます。 [17] [[SGML]] では、そもそも (XML でいう) [[実体値]]中で一般実体参照は使えません。単なる [CODE(SGML)[&]] で始まる文字列として扱うようです。 ([CODE(SGML)[引数表記]]内で [CODE(SGML)[[[ero]]]] を認知しません。) XML では追加制限として実体値中で文字参照でも一般文字参照でもない単独の文字 [CODE(XML)[&]] を使うことが出来ませんから、 このような表現になっているようです。 [[#comment]] *認知されない [3] パラメーター(引数)実体参照は、 DTD の認められた場所でのみ使用できます。 ([CODE(XML)[[[ATTLIST]]]] 宣言の属性の既定値指定中では使えません。) それ以外の場所では、単に [CODE(XML)[%]] で始まる文字の列として扱われます。 例えば、 [SAMP(XML)[%aiueo;]] の [SAMP(XML)[foo]] 要素の内容は文字列 [SAMP[%aiueo;]] で、同要素の [CODE(XML)[attr]] 属性の値は文字列 [SAMP[%name;]] になります。 また、型が [CODE(XML)[ENTITY]] 又は [CODE(XML)[ENTITIES]] である属性の値において[[数値文字参照]]は認知されません。 認知されないというよりそもそも[WEAK[構文的に]]存在できません。 (但し、属性値に使えないという意味ではないことに注意が必要です。例えば、 [SAMP(XML)[]] [WEAK[([SAMP(XML)[entity]] 属性は [CODE(XML)[ENTITY]] 型。)]] は''正しい''です。[[属性値表記]]が展開された属性値が [SAMP(XML)[entity-name]] となります。) [[#comment]] *禁止 [8] -XML では非解析実体への参照は出来ません。 (但し実体値の場合を除く。 >>26 参照) -実体値表記又は属性値表記以外の DTD 内では数値文字参照や一般実体参照は使えません。 -属性値では外部実体への参照は使えません。 これらの場合には[[致死的誤り]]となります。 [10] 例: [PRE[ %ext; "> &dtd; ]> (ext.dtd) %png-image; ]PRE] [[#comment]] * 誤り [26] 外部非解析実体への参照が実体値表記内にある場合、 [[SE]] までの仕様ではこれを禁止として致命的誤りにしていましたが、 2003-06-04 の修正 でこれを改め、致命的でない[[誤り]]としました。 これは、既存の実装の中に、そのような場合に致命的誤りとはせずに''処理しない''だけのものがあったため、 それに譲歩したようです。 [27] 従って、 [PRE[ ]PRE] の扱いは[[処理系定義]]となります。 [28] そもそも >>17 で一般実体参照は処理しないのに、 非解析実体の参照の場合だけ別扱いになっていたので、 この修正は妥当なものといえましょう。 [[#comment]] * 通知 [11] 値の型が [CODE(XML)[ENTITY]] 又は [CODE(XML)[ENTITIES]] である属性が指定されていた場合には、 妥当性を検証する処理系は応用にその外部解析実体のシステム/公開識別子及び関連付けられている[[記法]]のシステム/公開識別子を通知しなければいけません。 [WEAK[(妥当性を検証しない処理系では期待できません。)]] [[#comment]] *実体の置換文の生成 [16] 内部解析実体では実体宣言の実体値の値を、 また外部解析実体ではその実体に含まれている実際の[[文]]を、 [DFN[[[表記実体値]]]]といいます。 内部解析実体の表記実体値の文字参照とパラメーター実体参照を置換したものを、 [DFN[[[[置換文]]]]といいます。 外部解析実体の[DFN[置換文]]は、表記実体値から[[文宣言]]を除いたものです。 文字参照やパラメーター実体参照の置換は''行われません''。 [26] (表記)実体値では文字データとパラメーター実体参照と一般実体参照, それに数値文字参照が使えます。 置換文はこのうちの一般実体参照以外の参照する実体を取込んだ (置換した) ものです。但し、パラメーター実体参照はその置換文が取込まれるのではなく、参照されているパラメーター実体の表記実体値が取り込まれます。 [27] この部分は [ABBR[SE] [第2版]] errata で修正されています。 [28] >>25 で外部解析実体について参照の置換を行わないとしているのは、 外部解析実体が DTD にも文書本体にも使われ得るからでしょう。 [29] >>28 と >>9 とかの相互作用には注意した方がいいでしょう。 [SAMP(XML)[]] で、 [SAMP(XML)[]] の時正規化した属性値は [SAMP[foo[CODE(char)[SP]]bar]] になりますが、 [SAMP(XML)[]] なら正規化した属性値は [SAMP[foo[CODE(char)[TAB]]bar]] になるでしょう。 [[#comment]] *メモ