実体が宣言されていること

実体が宣言されていること

[3] 実体が宣言されていること (Entity Declared) は、実体参照によって参照されている実体が存在することを要求する XML整形式制約妥当性制約です。

仕様書

定義

整形式制約「実体が宣言されていること」

[5] DTD のない文書引数実体参照のない内部DTD部分集合のみの文書standalone="yes" のある文書にあっては、 外部部分集合内や引数実体内以外に現れる実体参照について、 実体参照内の Name外部部分集合内や引数実体内以外に現れる実体宣言Name一致しなければなりません。 ただし、整形式文書実体 amp, lt, gt, apos, quot宣言する必要はありません。 一般実体宣言は、属性並び宣言中の既定値に現れるその実体への参照より前になければなりません

なお、妥当性検証しない処理器引数実体外部部分集合に現れる実体宣言読み処理する義務はありません。そのような文書にあっては、実体宣言されなければならないとの規則は standalone="yes" の時のみ整形式制約となります。 >>4

妥当性制約「実体が宣言されていること」

[6] 外部部分集合引数実体参照のある文書では、 文書単独である (standalone="no" が指定されているか、 単独宣言がない) 場合には、実体参照Name実体宣言Name一致しなければなりません相互運用性のために妥当文書4.6 定義済み実体に定義する通りの形で実体 amp, lt, gt, apos, quot宣言するべきです引数実体宣言はその実体への参照より前になければなりません。 同様に一般実体宣言は、属性並び宣言中の既定値に現れるその実体への直接または間接の参照より前になければなりません>>4

整形式制約と妥当性制約

[7] 整形式制約妥当性制約により、妥当XML文書はすべての実体参照について実体宣言が含まれていることが要求されています。 ただし定義済み実体については MUST ではなく SHOULD となっています。

[8] 厳密に文言通り読むと定義済み実体についても妥当性制約MUST の適用範囲から除外されていないのですが、 そう解釈すると SHOULD が意味をなさなくなるので、例外を規定しているものと読むべきでしょう。

[9] XML処理器は次のように文書を処理しながら状態を管理することで、ある実体参照についてどちらの制約が適用されるか決定できます。

[14] ただし最初の引数実体参照より前に属性定義並び宣言があり、既定値一般実体参照がある場合、 遡って (または先読みして) 妥当性制約とする必要があります。従って上から下へと1パスで処理しながらどちらか決定することはできません。

[17] 逆に文書構文解析が完了した段階で「実体が宣言されていること」がいくつか検出されていた場合に、 整形式制約違反か妥当性制約違反かは次の手順により決定できます。

  1. [18] 初期状態では整形式制約とします。
  2. [20] xmlStandaloneなら、整形式制約として停止します。
  3. [19] 文書型宣言システム識別子があれば妥当性制約とします。
  4. [21] 引数実体を展開しようとした形跡があれば妥当性制約とします。
  5. [22] 現在の値を返します。

Web ブラウザー

[15] Webブラウザーは (文字実体参照が含まれる特別なものを除き) 外部部分集合引数実体参照を展開しないので、 引数実体参照に関する実体が宣言されていること制約違反は無視されます。

[16] Webブラウザー定義済み実体以外の一般実体参照について一般実体参照されていなければ、 DTD単独文書宣言の有無に関わらず、致死的誤りとみなします。

メモ

[1] <http://suika.fam.cx/~wakaba/-temp/test/xml/entity/ref-declared/param-in-internal-subset/pini-1.xml>:

<!DOCTYPE root [%a;]><root/>

(名無しさん)

[2] >>1

(名無しさん)