キャノニカルXML


W3C Logo

キャノニカルXML

W3Cワーキングドラフト 1999年7月29日

このバージョン[原文]:
http://www.w3.org/1999/07/WD-xml-c14n-19990729
最新のバージョン:
http://www.w3.org/TR/xml-c14n
編集者:
Tim Bray <tbray@textuality.com>
James Clark <jjc@jclark.com>
James Tauber <jtauber@jtauber.com>

この文書の位置づけ

これは、W3C会員およびその他の利害関係者によるレビューのためのW3Cワーキングドラフトである。このドラフトは、W3C XML文法ワーキンググループの合意内容を表したものである。ワーキンググループは、これ以上の本質的な変更を予定していない。しかしながら、W3Cやさらに広いコミュニティによるレビューにより新しい問題が明らかにされ、本質的な変更に至る場合もある。W3Cワーキングドラフトを参照素材として利用したり、進行中の作業以外のものとして引用することは不適切である。

このワーキンググループに関するコメントの送り先: w3c-xml-c14n-comments@w3.org

概要

この文書は、XML文書に含まれる情報のサブセットや、そのサブセットを表記するための文法を解説するものである。この文法は、キャノニカルXML (Canonical XML) と呼ばれるもので、XML文書の「論理的構造」をコード化するべく設計される。キャノニカルXML形式が同一である2個のXML文書は、多数のアプリケーションの用途に関して等価であるとみなされることになろう。

目次

1. はじめに
2. キャノニカルXMLに組み込まれる情報
    2.1 文書情報項目
    2.2 要素情報項目
    2.3 属性情報項目
    2.4 処理命令情報項目
    2.5 未知実体参照情報項目
    2.6 キャラクタ情報項目
    2.7 注釈情報項目
    2.8 文書型定義情報項目
    2.9 実体情報項目
    2.10 表記法情報項目
    2.11 属性宣言情報項目
3. 文書型定義の処理
4. 実体および参照の処理
5. キャノニカルXMLの文法
    5.1 キャラクタエンコーディング
    5.2 キャラクタエスケーピング
    5.3 プロローグ部
    5.4 エピローグ部
    5.5 要素
    5.6 タグ
    5.7 属性
    5.8 名前空間

付録

A. 参考資料
B. 謝辞 (非規範的)


1. はじめに

XML 1.0 勧告 [XML] は、XML文書と呼ばれるデータオブジェクトのクラスの文法を解説する。多数のアプリケーションの用途に関して等価であるXML文書も、その物理的表現において異なることがあり得る。とりわけ、実体構造や属性の並べ方、キャラクタエンコーディングにおいて異なることがある。これは、XML文書の等価性テストの多くは、バイトレベルの比較で実行できないことを意味する。このキャノニカルXML仕様書は、文法レベルで、しかもとりわけバイトごとの比較によってテストできるXML文書間の等価性の表記法を導入することを狙いとするものである。この文書が記述する文法では、「論理的に等価な」文書はバイトごとに同一である。

[定義:] この仕様書で解説されている文法は、キャノニカルXML (Canonical XML)と呼ばれる。[定義:] XML文書は、キャノニカルXMLに変換されてもかまわない(潜在的にいくらかの情報の損失がある)。この変形の結果は、元の文書のキャノニカル形式 (canonical form) として記述される。キャノニカルXMLはXMLである。すなわち、どのXML文書のキャノニカル形式も、XML文書である。

キャノニカルXMLの仕様にとって不可欠な側面が2つある。

  1. XML文書からの情報のうち、どれがそのキャノニカル形式に組み込まれるか(またどれが組み込まれないか)。
  2. キャノニカルXMLでは情報がどのように表記されるか。

2. キャノニカルXMLに組み込まれる情報

XML文書の中にある情報は、XML情報セット仕様書 [Infoset] で解説されているものである。このセクションは、情報セットの観点から、この情報のうちどの部分がキャノニカルXMLでも保存されるかを解説する。

キャノニカルXMLに組み込まれない情報も、なおキャノニカルXMLを生み出すときに使われることがあるので注意すること。とりわけ、

2.1 文書情報項目

キャノニカル形式は、文書情報項目の任意プロパティ、とりわけ表記法情報項目や実体情報項目はひとつも組み込まない。

2.2 要素情報項目

キャノニカル形式は、要素情報項目の必須プロパティをすべて組み込む。ただし、未知実体参照情報項目は除く。キャノニカル形式は、要素情報項目の任意プロパティはひとつも組み込まない。

2.3 属性情報項目

キャノニカル形式は、属性情報項目の必須プロパティをすべて組み込むが、任意プロパティはひとつも組み込まない。

2.4 処理命令情報項目

キャノニカルXMLは、処理命令情報項目を組み込まない。

2.5 未知実体参照情報項目

未知実体参照情報項目は、キャノニカル形式の文書には組み込まれない。キャノニカル化作業は文書中の実体参照すべてについて宣言の読み込みを要求するので、そうした情報項目はキャノニカルXMLには現れ得なかったのである。

2.6 キャラクタ情報項目

キャノニカル形式は、キャラクタ情報項目の必須プロパティをすべて組み込む。ただし、要素の内容の中にある空白を示すフラグは除く。キャラクタ情報項目の任意プロパティは、ひとつも組み込まれない。

とりわけ、CDATA部はキャノニカル形式の中では発生しない。キャノニカルXMLにある文法的に重要なキャラクタはすべて、この仕様書で解説されている様式でエスケープされるから、CDATA部は必要ないのである。

2.7 注釈情報項目

キャノニカルXMLは、注釈情報項目を組み込まない。

2.8 文書型定義情報項目

キャノニカルXMLは、文書型定義情報項目を組み込まない。

2.9 実体情報項目

キャノニカルXMLは、実体情報項目を組み込まない。

2.10 表記法情報項目

キャノニカルXMLは、表記法情報項目を組み込まない。

2.11 属性宣言情報項目

キャノニカルXMLは、属性宣言情報項目を組み込まない。

3. 文書型定義の処理

XML文書のキャノニカル化のプロセスは、そのスタンドアローン文書宣言次第である。宣言が存在し、その値が "yes&qout; である場合には、そのXML文書がスタンドアローン文書宣言の妥当性規定を満たしていることを前提とすると、DTDの外部的部分は、そのキャノニカル形式に影響を及ぼす素材を包含し得ない。

その他の場合はすべて、キャノニカル化のプロセスには、DTDの読み込みが必須である。DTDに由来する以下の情報は、XML文書のキャノニカル形式に影響を及ぼす。

DTDの外部コンポーネントのいくつかが引き出せない非スタンドアローン文書についてはキャノニカル化のプロセスが実効的に不可能であるので注意すること。キャノニカルXMLを生み出すよう設計されたソフトウェアの実装者は、このエラー条件のシグナルを送ることができるような、対ユーザのインターフェイスを用意するべきである。

キャノニカル形式のXML文書は、スタンドアローンである

4. 実体および参照の処理

キャノニカル形式のXML文書には、一般実体参照は包含されない。そうした参照はすべて展開され、キャノニカル形式は置換テキストだけを包含するのである。キャノニカル形式はDTDを包含しないので、パラメータ実体参照も包含しない。

"e1.xml" という名前のファイルが以下のテキストを包含しているとする。末尾の改行 (#A) キャラクタはないものとする。

Hallelujah, I'm a bum!

すると、以下のXML文書が同じディレクトリに保存されている場合、

<!DOCTYPE d [ 
 <!ENTITY lsb '['> 
 <!ENTITY rsb ']'> 
 <!ENTITY bum SYSTEM "e1.xml">
]>
<d>&lsb;&bum;&rsb;</d>

そのキャノニカル形式はこうなる。

<d>[Hallelujah, I'm a bum!]</d>

5. キャノニカルXMLの文法

このセクションは、キャノニカルXMLの文法を解説する。この文法は XML 1.0 の文法の適切なサブセットである。キャノニカル形式のXML文書は、このセクションで解説されているときを除き、元の形式と同一である。

キャノニカルXML文書はそれぞれ、下記の文法にある canonXML とラベルされた生成規則に合致しなければならない。ここで、「合致する」という言葉の表記法や語義は、XML 1.0 仕様書で解説されているものである。

キャノニカルXML
[1]  canonXML ::= element #xA
[2]  element ::= Stag (Datacharelement)* Etag
[3]  Stag ::= '<' Name NSDecl? (Att NSDecl?)* '>'
[4]  Etag ::= '</' Name '>'
[5]  NSDecl ::= #x20 'xmlns:' Prefix '=' '"' Attvalchar* '"'
[6]  Att ::= #x20 Name '=' '"' Attvalchar* '"'
[7]  Datachar ::= '&amp;' | '&lt;' | '&gt;' | '&#xD;'
| (Char - ('&' | '<' | '>' | #xD ))
[8]  Attvalchar ::= '&amp;' | '&lt;' | '&quot;' | '&#x9;' | '&#xA;' | '&#xD;'
| (Char - ('&' | '<' | '"' | #x9 | #xA | #xD))
[9]  Name ::= (Prefix ':')? NCName
[10]  Prefix ::= 'n' [1-9] [0-9]*

このセクションの残りは、この文法で表記されたものを越える追加的制約を表し、キャノニカルXMLの鍵となる側面に関して説明用の素材をさらに用意するものである。

5.1 キャラクタエンコーディング

キャノニカルXMLは、UTF-8をキャラクタエンコーディングとして用いる。

たとえば、以下の小さい文書について考えてみよう。

<?xml version="1.0" encoding="ISO-8859-1"?>
<lang>Espal</lang>

これは ISO-8859-1 ("ISO Latin") でエンコードされているので、"・ (&ntilde;) というキャラクタは #xF1 として保存される。もっとも、キャノニカルXMLでは、UTF-8 を使って、値が #xC3, #xB1 という2バイトで保存されることになろう。

Unicode標準規格 [Unicode] は、一定の「組み合わせキャラクタ」(簡単な例としては"・がある.)に複数の異なる表し方を認めている。そこで、ほとんどのアプリケーションでの利用において等価である内容をもつ2つのXML文書が、異なるキャラクタ列を包含していることがある。W3Cは、組み合わせキャラクタの表し方について標準化形式を勧告しており [CharModel]、さらに、この形式への変換が転送時に発生するという、「早期標準化」と呼ばれる慣習を推奨している。早期標準化が存在する場合には、Unicode的に等価な内容をもつ2つのキャノニカルXML文書は、組み合わせキャラクタ表現法を選択したことによる差異をさらけ出さないはずである。

5.2 キャラクタエスケーピング

XML 1.0 仕様書は、XMLプロセッサに対し、XML文書内の空白キャラクタが行の切り分けとして機能するときや、属性値の中に出現するときには、その空白キャラクタについて一定の単純な変形を実行するよう要求している。情報セットは、その文書の一部とみなされるキャラクタの結果的セットを記述する。たとえば、

キャラクタデータまたは属性値の中に出現する情報セットに由来するキャラクタはすべて UTF-8 エンコーディングで表現されるが、以下の例外がある。

以下の要素について、

<x a="&#xF1;">algorithms + data structures => programs</x>

キャノニカル形式はこうである。

<x a="uot;>algorithms + data structures =&gt; programs</x>

以下の要素について、

<x>markup delimiters=>(&#60; and &#38;), or <[CDATA[< and &]]>.</x>

キャノニカル形式はこうである。

<x>markup delimiters=&gt;(&lt; and &amp;), or &lt; and &amp;.</x>

5.3 プロローグ部

キャノニカルXMLには、プロローグ部はない。すなわち、ルート要素の開始タグの初めを示す "<" が最初のキャラクタである。

以下のXML文書について、

<!DOCTYPE x PUBLIC "myX" "x.dtd" [
 <!ENTITY a "aVal"> ]>
<?xml-stylesheet 
  href="mystyle.css" 
  type="text/css" ?> <?rating    mostly-harmless?> <x>y</x>

キャノニカル形式はこうである。

<x>y</x>

5.4 エピローグ部

キャノニカルXML文書には、改行 (#xA) キャラクタ1個からなる1キャラクタのエピローグ部がある。このキャラクタは、ルート要素の終了タグを示す ">" の直後に続くものである。

以下のXML文書について、

<x>y</x><?audio stop here ?>
<!--
Local variables:
mode: xml
End:
-->

キャノニカル形式はこうである。

<x>y</x>

5.5 要素

キャノニカルXMLでは、すべての要素に開始タグ1個と終了タグ1個とがある。内容をもたない要素については、間にキャラクタを挟まず、終了タグが開始タグに続く。

以下の要素について、

<x>
<a n="1"/><b n="2"/>
<c n="3"/></x>

キャノニカル形式はこうである。

<x>
<a n="1"></a><b n="2"></b>
<c n="3"></c></x>

5.6 タグ

キャノニカルXMLでは、終了タグや、属性をもたない開始タグについては、タグを閉じる ">" というキャラクタが、間に空白を挟まず直接に要素型の後に続く。属性や名前空間宣言はどれも、それぞれの属性や名前空間の前にスペース (#x20) キャラクタが1個ついた形で続く。その要素型名や属性名に名前空間がないとき、属性は属性名により(Unicodeキャラクタのコードポイントに基づいて)辞書的に保存される。名前空間が存在するときの並べ替えは、"" に記述される。

キャノニカル形式のXML文書は、オリジナルの文書で明示的に与えられたものかデフォルトで供給されたものかを問わず、その属性のすべてを組み込む。

以下の要素について、

<x a="Earth"
   ・"Wind"
   z="Fire"
>!!</x
>

キャノニカル形式はこうである。

<x a="Earth" z="Fire" ・"Wind">!!</x>

5.7 属性

キャノニカル形式のXML文書では、属性値は、XMLプロセッサについて要求される様式で標準化される。

キャノニカルXMLでは、属性名や属性値は、スペースなしに "=" というキャラクタ1個で分けられる。属性値はすべて二重引用符 (") キャラクタで区切られる。属性値の中では、二重引用符が出現する箇所はすべて "&quot;" で置き換えられる。

以下の開始タグについて、

<x a = '"Don&apos;t!", he cried.' b = "'>'">

キャノニカル形式はこうである。

<x a="&quot;Don't!&quot;, he cried." b="'>'">

5.8 名前空間

キャノニカルXMLでは、名前空間プリフィックスは、つねに n1, n2 などといった形式を取る。n の後に続く正整数は、プリフィックスの添え字と呼ばれる。

開始タグは、その要素型で使われるプリフィックスと、その開始タグの中に出現する属性名との名前空間宣言を厳密に包含する。名前空間宣言が承継されることはない。

註: このアプローチは、キャノニカル化作業が文脈非依存であるよう選ばれたものである。要素のキャノニカル形式は、それが文書のどこに出現するかに依存しない。

デフォルト名前空間が使われることはない。属性名が要素型や他の属性名と同じプリフィックスをもつことはない。プリフィックスの名前空間宣言は、そのプリフィックスを利用する要素型や属性の直後に続く。属性は、第一次的には、その属性名のプリフィックスが結びつけられている名前空間URIの辞書的順序により並べられ、第二次的には、属性名のローカル部分の辞書的順序により並べられる。ヌル名前空間URIは、非ヌル名前空間URIより前にあるものとみなされる。そのため、プリフィックスなしの属性はすべて、プリフィックスつきの属性すべての前にある。

開始タグの中では、名前空間プリフィックスはプリフィックスの添え字の順に出現する。開始タグの中で最初の名前空間プリフィックスの添え字は、つねに1である。開始タグの中に出現するプリフィックスの添え字は、つねに連続する整数である。そのため、要素型がプリフィックスを1個とる場合には、そのプリフィックスは n1 ということになる。プリフィックスをとる開始タグの中にある最初の属性名は、その要素型がプリフィックスをとる場合には n2 となり、それ以外の場合には n1 ということになる。後続の属性については、その属性名のプリフィックスの添え字は、先行する属性の名前のプリフィックスの添え字よりも大きいものになることになる。/p>

たとえば、以下の要素について、

<doc xmlns:x="http://w3.org/2" xmlns:y="http://w3.org/1">
<x:e a="a"/>
<x:e x:a="x:a"/>
<e x:a="x:a"/>
<e x:a="x:a" y:a="y:a"/>
<e x:a="x:a" a="a"/>
<e x:a="x:a" x:b="x:b"/>
</doc>

キャノニカル形式はこうである。

<doc>
<n1:e xmlns:n1="http://w3.org/2" a="a"></n1:e>
<n1:e xmlns:n1="http://w3.org/2" n2:a="x:a" xmlns:n2="http://w3.org/2"></n1:e>
<e n1:a="x:a" xmlns:n1="http://w3.org/2"></e>
<e n1:a="y:a" xmlns:n1="http://w3.org/1" n2:a="x:a" xmlns:n2="http://w3.org/2"></e>
<e a="a" n1:a="x:a" xmlns:n1="http://w3.org/2"></e>
<e n1:a="x:a" xmlns:n1="http://w3.org/2" n2:b="x:b" xmlns:n2="http://w3.org/2"></e>
</doc>

付録

A. 参考資料

CharModel
Character Model for the World Wide Web, Martin J. Dürst 編. http://www.w3.org/TR/WD-charmod で入手可能。
Infoset
XML Information Set, John Cowan, David Megginson 編. http://www.w3.org/TR/WD-xml-infoset で入手可能。
Namespaces
Namespaces in XML, Tim Bray, Dave Hollander, Andrew Layman 編. http://www.w3.org/TR/REC-xml-names で入手可能。
Unicode
The Unicode Consortium. The Unicode Standard, Version 2.0. Reading, Mass.: Addison-Wesley Developers Press, 1996.
XML
Extensible Markup Language (XML) 1.0, Tim Bray, Jean Paoli, C. M. Sperberg-McQueen 編. 1998年2月10日. http://www.w3.org/TR/REC-xml で入手可能。

B. 謝辞 (非規範的)

この仕様書を生み出す作業は、W3C XML文法ワーキンググループの会員組織によって成し遂げられたものである。

Joel Nava, Adobe (共同グループ長);Tim Bray, 客員エキスパート (共同グループ長);James Clark, 客員エキスパート (共同グループ長);James Tauber, 客員エキスパート (共同グループ長);Bert Bos, W3C (W3C連絡役);Joseph Reagle, W3C (W3C連絡役);Gary Bisaga, Mitre;Tim Boland, NIST, 客員エキスパート;Charles Frankston, Microsoft;Paul Grosso, Arbortext;Eduardo Gutentag, Sun Microsystems;Michael Hyman, Microsoft;Murata Mokoto, Fuji Xerox;Michael Sperberg-McQueen, U. Ill. and W3C;Steph Tryphonas, Microstar;François Yergeau, Alis


どら猫本舗 (webmaster@doraneko.org)