第22回 物理構造における「文字参照」と「実体参照」 Page 2

川俣 晶
株式会社ピーデー
2004/6/2

実体参照の定義

 ここから実体参照の話に変わる。

[Definition: An entity reference refers to the content of a named entity.] [Definition: References to parsed general entities use ampersand (&) and semicolon (;) as delimiters.] [Definition: Parameter-entity references use percent-sign (%) and semicolon (;) as delimiters.]

[定義:実体参照は、名前の付いた実体の内容を参照する。][定義:一般解析対象実体への参照は、アンド記号(&)およびセミコロン記号(;)を区切り子として用いる。][定義:パラメタ実体への参照は、パーセント記号(%)およびセミコロン(;)を区切り子として用いる。]

 ここでは3つの用語の定義が記述されている。最初は、entity reference(実体参照)の用語定義である。つまり、実体参照とは、実体を参照することである、という当たり前の話が書かれている。名前の付いた実体、という表記が特に目に付くが、名前を通して参照される以上、当然の要求となる。

 次の文章は、非常に手ごわい難物である。というのは、JIS版では明確ではないものの、W3C版でははっきりと「Definition」と書いているにもかかわらず、ほかの用語定義のように定義される言葉がボールド文字で強調されていないためである。では、これが用語の定義ではないのかというと、そんなことはない。title属性に対応したWebブラウザを使うと、それを確認できる。例えば、IEであれば、マウスポインタを、「Definition」の上に持っていくと、General Entity Referenceという言葉がツールチップとして表示される。つまり、この文章は、General Entity Reference(一般解析対象実体参照)という用語の定義なのである。しかし、この言葉が直接的に文章に出てこないという妙な構造になっている。さて、文章を見てみよう。この規定(区切り子として2種類の記号を使う)は、次の用語定義と対になって機能する。2種類の記号の使い分けは、次の用語定義で示されているのである。

 次の文章は、Parameter-entity references(パラメタ実体参照)についての用語定義である。アンド記号(&)ではなく、パーセント記号(%)を使うところが、一般実体参照との相違点である。

実体参照の生成規則

 次は、実体参照に関するEBNFによる生成規則である(EBNFの詳細については、「第2回 XML勧告読解に必須のEBNF」を参照)。

Entity Reference
[67]    Reference    ::=    EntityRef | CharRef
[68]    EntityRef    ::=    '&' Name ';' [WFC: Entity Declared]
[VC: Entity Declared]
[WFC: Parsed Entity]
[WFC: No Recursion]
[69]    PEReference    ::=    '%' Name ';' [VC: Entity Declared]
[WFC: No Recursion]
[WFC: In DTD]

 内容は難しくない。生成規則[67] Reference(参照)は、EntityRef(実体参照)かCharRef(文字参照)のいずれかである。生成規則[68] EntityRef(実体参照)は、生成規則「5」 Nameを'&'と';'で挟んだものである。生成規則[69] PEReference(パラメタ実体参照)は、生成規則「5」 Nameを'&'と';'で挟んだものである。ここでは、生成規則[67] Referenceが生成規則[69] PEReferenceを参照していないことだけ注意して確認しておこう。一般実体参照とパラメタ実体参照は、同じ場所には出現しないので、どちらか一方という選択もあり得ないのである。

実体参照の整形式制約と妥当性制約

 この後、整形式制約と妥当性制約が続く。

整形式制約:Entity Declared(実体が宣言されていること)

Well-formedness constraint: Entity Declared

In a document without any DTD, a document with only an internal DTD subset which contains no parameter entity references, or a document with "standalone='yes'", for an entity reference that does not occur within the external subset or a parameter entity, the Name given in the entity reference MUST match that in an entity declaration that does not occur within the external subset or a parameter entity, except that well-formed documents need not declare any of the following entities: amp, lt, gt, apos, quot. The declaration of a general entity MUST precede any reference to it which appears in a default value in an attribute-list declaration.

整形式制約:Entity Declared(実体が宣言されていること)

DTDを持たない文書、パラメタ実体参照を含まない内部DTDサブセットだけを持つ文書または"standalone='yes'"を持つ文書において、外部サブセットまたはパラメタ実体中に出現しない実体参照では、その実体参照のNameは、外部サブセットまたはパラメタ実体で出現しない実体宣言マッチしなければならないが、整形式の文書は、実体amp、lt、gt、apos、quotを宣言する必要はない。一般実体の場合は、属性リスト宣言のデフォルト値内での参照より先に、宣言が現れなければならない。
(注:続く)

 これは、整形式制約:Entity Declared(実体が宣言されていること)である。文章が少し長いが、これで全文ではない。

 冒頭は長い文章で分かりにくいが、複雑ではないので分解すれば問題なく読めるだろう。まず、条件は以下のいずれかを満たす文書の場合である。

  • DTDを持たない文書
  • パラメタ実体参照を含まない内部DTDサブセットだけを持つ文書
  • " standalone='yes'"を持つ文書

 そして、対象は「外部サブセットまたはパラメタ実体中に出現しない実体参照」である。そのような実体参照で記述される実体名(生成規則[5] Nameに該当する)に制約が与えられているわけである。その制約とは、「外部サブセットまたはパラメタ実体で出現しない実体宣言にマッチしなければならない」というものである。分かりにくい文章という気もするが、これが意図するところは難しくない。XMLでは、DTDなどがすべて読み込まれるとは限らず、実体が常に解決されるとは限らない。しかし、解決できないどんな実体への参照も許されるとなると、使い勝手が悪過ぎる。そこで、少なくともこの程度の実体の参照は、解決可能な場所に宣言されていなければならない、という条件を述べていると思う。

 さらに、この文章には続きがある。上記の例外として、整形式の文書は、実体amp、lt、gt、apos、quotを宣言する必要はない。例えば、&のような実体参照は、宣言なしに使うことができる。ここに書かれた5種類の名前は極めて特権的な存在である。この5つだけが特別扱いなのは、これらの文字は特別な意味を持つ場合があり、直接記述できないときに代替的な書式が必要とされるためである。もっとも、代替的な書式として文字参照を使うこともできるので、必ずしも必須とはいえない。しかし、&ではなく、&と記述すると、XML文書の読みやすさが著しく低下するので、あった方がよい特権であるといえるだろう。

 さて、文章の続きである。次は属性リスト宣言で、属性を省略したときに指定されたと見なすデフォルト値を指定できる。このデフォルト値を、一般実体の参照を用いて記述する場合の話である。この場合、この参照が記述されるよりも前に、実体を宣言しなければならない、ということである。

 なぜ、このような規定があるのかと考えてみたが、おそらくデフォルト値の立場が特殊であるという事情がありそうだと気付いた。デフォルト値は、属性が省略されたときの値であるから、当然属性値の一種である。属性値に含まれる実体参照はすべて展開されたうえで、応用プログラムに文字列として渡される。ということは、XMLプロセッサでは属性値を文字列として扱うように作成するのが自然な流れだろう。とすると、当然、デフォルト値も文字列として記憶し、扱いたいわけである。それを実現するためには、属性リスト宣言を解析した時点で、デフォルト値が文字列として確定している必要がある。つまり、デフォルト値が参照している実体は、それ以前に宣言されていなければならないわけである。

 次は、まだ整形式制約:Entity Declared(実体が宣言されていること)の続きである。

Note that non-validating processors are not obligated to to read and process entity declarations occurring in parameter entities or in the external subset; for such documents, the rule that an entity must be declared is a well-formedness constraint only if standalone='yes'.

(注:「整形式制約:Entity Declared」の続き)

パラメタ実体または外部サブセットで出現する実体宣言の読み込み・処理を、妥当性を検証しないプロセサに義務づけてはいないことに注意が必要であり、それらの文書では、実体は宣言されなければならないという規則は、standalone='yes'の場合だけ、整形式制約となる。

 冒頭の文章は重要なポイントである。ここまでの文章で、実体が宣言されているべき条件について記述されていたが、あらゆる実体宣言を処理することは要求されていない。妥当性を検証しないプロセッサでは、パラメタ実体または外部サブセットで出現する実体宣言の読み込み・処理は行わなくてもよい(行ってもよい)、ということである。また、standalone='yes'の場合だけ、条件が異なることも書かれている。非依存文書宣言(「第11回 XMLの外部参照と非依存文書宣言」で取り上げた)のstandalone='yes'という指定の意図からすれば、宣言の条件に影響を与えることも、当然の成り行きといえるだろう。

妥当性制約:Entity Declared(実体が宣言されていること)

Validity constraint: Entity Declared

In a document with an external subset or external parameter entities with "standalone='no'", the Name given in the entity reference MUST match that in an entity declaration. For interoperability, valid documents SHOULD declare the entities amp, lt, gt, apos, quot, in the form specified in 4.6 Predefined Entities. The declaration of a parameter entity MUST precede any reference to it. Similarly, the declaration of a general entity MUST precede any attribute-list declaration containing a default value with a direct or indirect reference to that general entity.

妥当性制約:Entity Declared(実体が宣言されていること)

外部サブセットまたは外部パラメタ実体を持ち、さらに "standalone='no'"を持つ文書において、実体参照で用いるNameは、ある実体宣言に含まれる名前とマッチしなければならない。相互運用性のためには、妥当な文書は4.6 定義済み実体で指定した書式によって、実体 amp、lt、gt、apos、quotを宣言することが望ましい。パラメタ実体の場合は、宣言は、参照より先に現れなければならない。同様に、一般実体の場合は、その一般実体への直接または間接的な参照を伴ったデフォルト値を含む属性リスト宣言よりも先に、宣言が現れなければならない。

 これは妥当性制約:Entity Declared(実体が宣言されていること)である。前の制約と名前は同じであるが、前のものは整形式制約、こちらは妥当性制約である。

 冒頭の文章が述べているのは、ここで指定された条件を満たす場合、参照される実体は宣言されていなければならない、ということである。しかし、その条件を満たさない場合は実体が宣言されていなくてもよいのかというと、必ずしもそうではない。すでに、整形式制約で別の宣言すべき条件が示されていて、それも適用されるためである。これは、整形式制約に追加される制約であると考えると分かりやすいかもしれない。

 次の「相互運用性のためには」とは「拘束力は持たない推奨事項について記述する文を示す。ISO 8879へのWebSGML適用附属書以前から存在するSGMLプロセッサが、XML文書を処理できる可能性を高めるために、これらの推奨事項を取り入れる。」という意図を示す。つまり、XMLプロセッサでのみ処理される場合は、忘れてしまってもさほど実害はない規定だろう。

 次に、一般実体は、DTDで宣言して、文書の内容で参照するので、必ず内容よりも宣言が先にくる。しかし、パラメタ実体はDTDで宣言して、DTDで参照するので、順番が必ずしも明確ではない。そのため、ここで宣言は参照より先に現れねばならないことを規定している。

 次は、整形式制約の方で書かれたデフォルト値の規定と同趣旨のものである。しかし、それが対象とする範囲が、整形式制約とはやや異なることが文面から分かる。

整形式制約:Parsed Entity(解析対象実体)

Well-formedness constraint: Parsed Entity

An entity reference MUST NOT contain the name of an unparsed entity. Unparsed entities may be referred to only in attribute values declared to be of type ENTITY or ENTITIES.

整形式制約:Parsed Entity(解析対象実体)

実体参照は、解析対象外実体の名前を含んでいてはならない。解析対象外実体は、ENTITY型またはENTITIES型として宣言した属性値としてだけ参照できる。

 これは、整形式制約:Parsed Entity(解析対象実体)である。

 冒頭の文章の理由は、次の文章によって理由が説明されている。解析対象外実体は、ENTITY型またはENTITIES型の属性値としてのみ参照可能であって、実体参照を通じては参照できないということである。このことは、すでに説明済みであるが、ここでは意図を分かりやすくするために、付記されているものと思う。

整形式制約:No Recursion(再帰なし)

Well-formedness constraint: No Recursion

A parsed entity MUST NOT contain a recursive reference to itself, either directly or indirectly.

整形式制約:No Recursion(再帰なし)

解析対象実体は、それ自体への参照を、直接にも間接にも含んではならない。

 これは、整形式制約:No Recursion(再帰なし)である。

 例えば、解析対象実体aの宣言に解析対象実体aが含まれていると、実体の参照を解決するために自分自身を参照することになり、これが無限に繰り返される。「間接にも」ということは、解析対象実体aの宣言に解析対象実体bが含まれ、解析対象実体bの宣言に解析対象実体aが含まれている、というような宣言も駄目だということである。間接的に宣言しても、結局、無限の繰り返しに陥ってしまうためである。

整形式制約:In DTD(DTDの中)

Well-formedness constraint: In DTD

Parameter-entity references MUST NOT appear outside the DTD.

整形式制約:In DTD(DTDの中)

パラメタ実体参照は、DTD内にだけ、出現してよい。

 これは、整形式制約:In DTD(DTDの中)である。

 パラメタ実体参照はそもそもDTDの中だけで使うものなので、このような制約が書かれるのは奇異に思えるかもしれないが、この意図はEBNFでうまく記述できていないのである。EBNFを補足するために、この制約が設けられているのだろう。

文字参照、実体参照の例

 次は、文字参照、実体参照の例である。

Examples of character and entity references:

Type <key>less-than</key> (&#x3C;) to save options.
This document was prepared on &docdate; and
is classified &security-level;.

Example of a parameter-entity reference:

<!-- declare the parameter entity "ISOLat2"... -->
<!ENTITY % ISOLat2
         SYSTEM "http://www.xml.com/iso/isolat2-xml.entities" >
<!-- ... now reference it. -->
%ISOLat2;

 最初の例は、文字参照と実体参照の例である。&#x3C;は、16進数の3Cというコードを持つ文字である、<を記述している。&docdate;と&security-level;は明示されていないが、どちらも一般解析対象実体参照を意図したものだろう。例えば、実体docdateの値が4 February 2004であり、実体security-levelの値が1だとすると、この文章は、以下のように扱われる。

 This document was prepared on 4 February 2004 and is classified 1.

 そして、日付とセキュリティレベルを差し替えたい場合は、本文に手を入れることなく、実体の宣言だけを変更すればよいことになる。

 次の例は、パラメタ実体参照の例である。宣言と参照の2段階が記述されている。宣言は<!ENTITYで始まる行が宣言であるが、それについてはこの後で説明が行われるので、ここでは理解できなくてもよい。%ISOLat2;という部分が、宣言されたパラメタ実体の参照である。これは外部パラメタ実体となり、どのような置換テキストに置き換えられるかは、この例の範囲内では予測できない。

 さて、以上で「4.1 Character and Entity References(文字参照および実体参照)」の終わりまでを読み切った。次回は、「4.2 Entity Declarations(実体宣言)」を読んでいこう。今回は、実体を参照する規定を読んだが、次回は参照される実体を宣言する方法について読んでいく。参照と宣言がそろってこそ、実体の使い方が見えるものである。実体をものにするために、ぜひとも宣言まで読み切ろう。(次回に続く)

Page 1 2/2  

 Index
やさしく読む「XML 1.0勧告」 第22回
物理構造における「文字参照」と「実体参照」
  Page 1
文字参照および実体参照の概要
文字参照の定義
文字参照の生成規則と整形式制約
文字参照の表現形式
Page 2
実体参照の定義
実体参照の生成規則
実体参照の整形式制約と妥当性制約
文字参照、実体参照の例

 

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


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

注目のテーマ

HTML5+UX 記事ランキング

本日月間