第31回 実体置換テキストの構築と定義済み実体 Page 1

XML 1.0は、1998年にW3Cから勧告として公開された。当然中身は英語で、しかもEBNFと呼ばれる式によって重要な部分が記述してある。この連載では、XML 1.0を深く理解するために、そのXML 1.0勧告の最新版「Extensible Markup Language (XML) 1.0 (Third Edition)」をだれでも分かるように、やさしく読み解きながら解説していくことを目指している。(編集局)

川俣 晶
株式会社ピーデー
2005/3/9

実体を置換するタイミングの規定

主な内容
--Page 1--
実体を置換するタイミングの規定
実体置換テキストの構築
--Page 2--
実体置換テキストの活用例
--Page 3--
定義済み実体の規定

 前回は、「4.4 XML Processor Treatment of Entities and References(4.4 XMLプロセッサによる実体および参照の扱い)」を読み終えた。これは、さまざまな実体の種類と、それが出現する場所(文脈)ごとに、どのように処理すればよいのかを示した表とその説明文から構成され、XML1.0勧告最大の山場かもしれない大物であった。しかし、この表があることで分かりやすくなるという側面もあるので、決して無駄ではない。ここに規定された内容には、ほかの場所で記述された規定との重複が見られる場合があるが、表形式で実体の種類と場所(文脈)の関係を一望できる利便性は高い。そして、表形式にしたことで、あいまいさも減らすことができるのである。

 さて、今回は「4.5 Construction of Entity Replacement Text(4.5 実体置換テキストの構築)」と「4.6 Predefined Entities(4.6 定義済み実体)」を読んでいく。「実体置換テキストの構築」は、実体を置換する際に使われる「実体置換テキスト」をどのように構築するかについて詳しい規定が記述されている。さまざまな種類の参照を、どのタイミングで置換するかが詳しく指示されている。これを守ることで、相互運用性の高いXMLプロセッサを開発できる。一方、「定義済み実体」の方は、われわれが特別な文字を記述するためによく使う「<」や「&」などの実体について詳細な規定を行っている個所である。初心者であっても必ず使う非常に基本的な機能だが、それを定義するには少々ややこしい問題もつきまとうので、注意して読んでいこう。

編集注:この連載では、XML 1.0勧告であるW3Cの「Extensible Markup Language (XML) 1.0 (Third Edition)」(英語)を参照し、その日本語訳として、日本工業規格 JIS X 4159:2002(Second Edition相当。リンク先は該当規格の原案ですが、最終版とほぼ同等の内容です)と追補1として出版予定の原稿(Third Edition対応)を参照しています。本文中のピンクの地の部分は、XML 1.0勧告の原文を示しています。

実体置換テキストの構築

 さて「4.5 Construction of Entity Replacement Text(4.5 実体置換テキストの構築)」である。ここの冒頭段落はSecond EditionとThird Editionの差分をカラーで示した版を見ると、大量の追加テキストが存在していることが分かるだろう。つまり、大幅に変わっている。そもそも見出しからして、「Construction of Internal Entity Replacement Text」から「Internal(内部)」の文字を取り除くという変更が行われている。つまり、「内部実体」を対象とする内容から、「内部」を取り去り、「実体」を対象とする内容に変更されたことになる。まさに、大変更である。このような変化が容易に見て取れるので、差分をカラーで示した版を見るのもエディトリアルな意味で面白いだろう。

 この変更はJIS版ではどうなっているのか。一見してSecond Editionの正誤表による修正であるから、「JIS X 4159」の追補1に含まれるかのように思えるが実はそうではない。比較的早期に正誤表に記載された誤りは、「JIS X 4159:2002」発行時にすでに反映されているので、この修正も反映済みである。つまり、「JIS X 4159」と書かれたJIS規格を持っている場合は、反映済みということである。正誤表の反映には、このようなややこしい問題もある。

 さて、余談はこれぐらいにして、早速本文を読んでいこう。最初の段落は、主にliteral entity value(リテラル実体値)とreplacement text(置換テキスト)という2つの用語の定義を与えている。

In discussing the treatment of entities, it is useful to distinguish two forms of the entity's value. [Definition: For an internal entity, the literal entity value is the quoted string actually present in the entity declaration, corresponding to the non-terminal EntityValue.] [Definition: For an external entity, the literal entity value is the exact text contained in the entity.] [Definition: For an internal entity, the replacement text is the content of the entity, after replacement of character references and parameter-entity references.] [Definition: For an external entity, the replacement text is the content of the entity, after stripping the text declaration (leaving any surrounding whitespace) if there is one but without any replacement of character references or parameter-entity references.]

実体の取り扱いの規定で、実体値を2つの形式に区別することは役に立つ。[定義:内部実体の場合、リテラル実体値は、実体宣言内に実際に存在する、引用符で囲まれた文字列とし、これは、非終端記号EntityValueとマッチする。] [定義:外部実体の場合、リテラル実体値は、その実体に含まれるテキストそのままとする。] [定義:内部実体の場合、置換テキストは、文字参照およびパラメタ実体参照の置き換え後における、実体の内容とする。] [定義:外部実体の場合、置換テキストは、実体の内容とするが、テキスト宣言は(もしあるなら)取り除き(周辺の空白文字は除かない)、文字参照またはパラメタ実体参照は置き換えないものとする。]

 冒頭の文章で述べている2つの形式とは、内部実体と外部実体であることが、この後に述べられている。この2つは扱いがまったく異なり、これまでのXML勧告の文章中でも区別されていることが多かったと思う。この文章はそれを再確認しているにすぎない。

 次は「literal entity value(リテラル実体値)」という用語の定義の文章である。この定義の文章は2つある。1つは内部実体の場合、もう1つは外部実体の場合である。最初の定義では2つのことが書かれている。1つは、内部実体のリテラル実体値とは、実体宣言の中に書かれた引用符で囲まれた文字列であるということである。実体の値は、内部実体であれば、実体宣言の中にすでに書かれているので、それを使うということである。もう1つは、リテラル実体値は生成規則[9] EntityValueにマッチするということである。生成規則[9] EntityValueは以下のような内容であり、本連載の第6回「XMLにおける名前、トークン、リテラルデータ」で読んだ。

[9]    EntityValue    ::=    '"' ([^%&"] | PEReference | Reference)* '"'
      | "'" ([^%&'] | PEReference | Reference)* "'"

 次は、外部実体の場合のリテラル実体値の定義である。短いストレートな文章だが、あるがまま扱うという意思表示にはもちろん価値がある。特殊な変形や加工を行わなくてよい、という許可ではなく、そのような変形や加工を行ってはならないという禁止規定に相当するためである。

 次は、置換テキストの用語定義の文章が続くが、これも内部実体と外部実体の2つの定義がある。まず、内部実体の置換テキストは文字参照とパラメタ実体参照の置き換えを行った後の状態の内容であることが示されている。しかし、一般の実体参照の置き換えは要求されていないことに注意が必要である。

 次の文章は長いので、分割して解釈しよう。前半部は、基本的には置換テキスト=実体の内容であるが、テキスト宣言がある場合はそれが取り除かれる、と述べられている。そして、周辺の空白文字は除かないという規定により、テキスト宣言の行末に付け加えた改行などは取り除かれることなく保存されることが分かる。つまり、テキスト宣言を1行で書いた場合、その1行が消滅して外部実体が1行短くなるわけではない、ということである。消滅するのは厳密な意味でのテキスト宣言だけで、その後に書き込んだ改行が消えるわけではないので、全体としての行数は変わらないことになる。後半部に付け加えられている文章は、内部実体の規定と対になる説明である。内部実体ではこの2つは置き換えが発生するが、外部実体ではそれが起こらないということである。(次ページへ続く)

  1/3

 Index
やさしく読む「XML 1.0勧告」 第31回
実体置換テキストの構築と定義済み実体
Page 1
・実体を置換するタイミングの規定
・実体置換テキストの構築
  Page 2
・実体置換テキストの活用例
  Page 3
・定義済み実体の規定


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


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

注目のテーマ

HTML5+UX 記事ランキング

本日月間