標準情報(TR)  TR X 0008:1998

拡張可能なマーク付け言語(XML)

Extensible Markup Language(XML)



序文

この標準情報(TR)は, 1997年12月にWorld Wide Web Consortium(W3C)から公表された Extensible Markup Language version 1.0勧告案を翻訳し, 技術的内容を変更することなく作成した標準情報(TR)である。

1. 一般

1.0 適用範囲

拡張可能なマーク付け言語XML(eXtensible Markup Language)は,XML文書というデータオブジェクトのクラスを規定し,XML文書を処理するプログラムの動作の一部を規定する。XMLは,SGML(標準一般化マーク付け言語,Standard Generalized Markup Language)[ISO8879]の制限したサブセットとする。構造上,XML文書は,かならずSGML規格に適合する。

XML文書は,実体という記憶単位からなり,実体は,解析されるデータ又は解析されないデータからなる。解析されるデータは,文字からなり,その一部は,文書の文字データを構成し,一部は,マーク付けを構成する。マーク付けは,文書の記憶レイアウト及び論理構造についての記述を表す符号とする。XMLは,記憶レイアウト及び論理構造についての制約条件を記述する機構を提供する。

XMLプロセサというソフトウェアモジュールは,XML文書を読み込み,その内容及び構造へのアクセスを提供するために用いる。 XMLプロセサは,他のモジュールのために動作することを前提とし,そのモジュールをアプリケーションという。この標準情報(TR)は,XMLプロセサが行わなければならない振舞いを規定する。つまり,XMLデータの読込み方法を規定し,アプリケーションに提供する情報を規定する。

1.1 経緯及び目標

1996年にWorld Wide Web Consortium(W3C)の中に設立したXML作業グループ(以前は, SGML編集レビュー委員会と呼ばれた。)が,XMLを開発した。この作業グループの議長を,Sun MicrosystemsのJon Bosakが勤める。W3Cが組織し,以前はSGML作業グループと呼ばれたXML SIG(Special Interest Group)も,XMLの制定に非常に活発に参画した。 Dan Connollyは,作業グループのW3Cにおける連絡係を務めた。

XMLの設計目標を,次に示す。

XML第1.0版を理解し,それを処理する計算機プログラムを書くために十分な情報は,この標準情報(TR)及び関連する規格(文字用として,Unicode及びISO/IEC 10646,言語識別タグ用として,インタネット RFC 1766,言語コード用として,ISO 639,並びに国コード用として,ISO 3166。)で,すべて示す。

この版のXMLの規定は,公開レビュー及び議論を目的とする。テキスト及び法律上の注意を改変しない限り,自由に配布してもよい。

1.2 定義

XML文書の規定のために使用する用語は,この標準情報(TR)内で定義する。次に示す語句は,それらの用語を定義するため,及びXMLプロセサの動きを規定するために使用する。

1.2.1 してもよい(may)

適合する文書又はXMLプロセサは,記述されたとおりに動作してもよいが,そのとおりにする必要はない。

1.2.2 しなければならない(must)

適合する文書又はXMLプロセサは,記述されたとおりに動作することが要求される。そうでなければ,エラーとする。

1.2.3 エラー(error)

この標準情報(TR)が定める規則に対する違反。結果は定義しない。適合するソフトウェアは,エラーを検出して報告してもよく,エラーから回復してもよい。

1.2.4 致命的エラー(fatal error)

適合するXMLプロセサが検出しなければならず,アプリケーションに報告しなければならないエラー。致命的エラーを発見したあと,プロセサは,それ以降のエラーを探すためにデータ処理を続行してもよく,エラーを発見した場合は,そのエラーをアプリケーションに報告してもよい。エラー訂正をサポートするために,プロセサは,未処理データ(文字データ及びマーク付けの混在したもの。)を文書から取り出し,アプリケーションに渡してもよい。しかし,一度,致命的エラーを検出したら,プロセサは,通常の処理を続行してはならない。つまり,プロセサは,文字データ及び文書の論理構造についての情報を,通常の方法でアプリケーションに渡し続けてはならない。

1.2.5 ユーザのオプション指定によっては(at user option)

適合するソフトウエアは,記述されたとおりに振る舞ってもよい(may),又は振る舞わなくてはならない(must)(文章中の助動詞による。)。そのとおりに振る舞う場合は,記述された振舞いを選択又は拒否する手段をユーザに提供しなければならない。

1.2.6 妥当性制約(validity constraint)

すべての妥当なXML文書に適用する規則。妥当性制約の違反は,エラーとする。ユーザのオプション指定によっては,検証を行うXMLプロセサは,このエラーを報告しなければならない。

1.2.7 整形式制約(well-formedness constraint)

すべての整形式のXML文書に適用する規則。整形式制約の違反は,致命的エラーとする。

1.2.8 マッチ(match)

a) 文字列又は名前のマッチ 比較する二つの文字列又は名前は,同一でなければならない。ISO/IEC 10646において,複数の表現が可能な文字[例えば,合成形式及び基底+発音符(ダイアクリティカルマーク)形式]は,どちらの文字列も同じ表現のときに限り,マッチする。ユーザのオプション指定によっては,プロセサは,その文字を標準形に正規化してもよい。比較のとき, 大文字と小文字との区別をする。
b) 文字列と文法中の規則とのマッチ ある生成規則から生成する言語に,ある文字列が属するとき,この文字列は,この生成規則にマッチするという。
c) 内容と内容モデルとのマッチ ある要素が,要素の妥当性の制約に示す意味で適合するとき,この要素は,その宣言にマッチするという。

1.2.9 互換性のため(for compatibility)

XMLの機能であって,XMLがSGMLと互換であることを保証するためだけに導入されるもの。

1.2.10 相互運用性のため(for interoperability)

拘束力はもたない推奨事項。WebSGML Adaptations Annex to ISO 8879以前から存在するSGMLプロセサが,XML文書を処理できる可能性を高めるために取り入れるもの。

2. 文書

この標準情報(TR)で定義する意味で,整形式とするデータオブジェクトを,XML文書という。整形式のXML文書が,さらに,ある制約条件を満足すれば,妥当なXML文書とする。

いずれのXML文書も,論理構造及び物理構造をもつ。物理的には,文書は,実体と呼ぶ単位からなる。ある実体は,文書内に他の実体を含むために,その他の実体を参照してもよい。文書は,“ルート”すなわち文書実体から始まる。論理的には,文書は,宣言,要素,コメント,文字参照及び処理命令を含み,これらすべては,文書内で明示的なマーク付けによって示す。論理構造及び物理構造は,以降に示すとおりに,厳密に入れ子になっていなければならない。

2.1 整形式のXML文書

あるテキストオブジェクトが,次のいずれかのとき,そのテキストオブジェクトを整形式のXML文書と呼ぶ。

文書
[1] document ::= prolog element Misc*

document生成規則にマッチするとは,次を意味する。

これらの結果として,文書内のどの非ルート要素Cに対しても,ある他の要素Pが存在し,Cは,Pの内容に含まれるが,Pの内容に含まれる他の要素に含まれることはない。このとき,PCといい,CPという。

2.2 文字

解析対象実体は,テキスト(文字の並びであって,マーク付け又は文字データを表してもよい。)を含む。文字は,テキストの最小単位であって,ISO/IEC 10646[ISO10646]に規定される。許容する文字は,タブ,改行,復帰並びにUnicode及びISO/IEC 10646が許容する図形文字とする。

文字の範囲
[2] Char ::= #x9 | #xA | #xD | [#x20-#D7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* 任意のUnicode文字。ただし,サロゲートブロック,FFFE及びFFFFは除く。 */

文字番号をビットパタンに符号化する機構は,実体ごとに違ってもよい。すべてのXMLプロセサは,ISO/IEC 10646のUTF-8符号化及びUTF-16符号化を受け付けなければならない。二つのどちらが用いられているかを明示するための機構,及び他の符号化方法を利用するための機構は,文字の符号化に記述する。

どの符号化方法を用いるかに関係なく,ISO/IEC 10646の文字集合にあるすべての文字は,そのUCS-4コード値と等価な10進数又は16進数によって,参照できる。

2.3 共通の構文構成子

2.3では,文法内で広く使用するいくつかの記号を定義する。

S (空白)は,一つ若しくは複数のスペース文字(#x20),復帰,改行又はタブから成る。

空白
[3] S ::= (#x20 | #x9 | #xD | #xA)+

便宜上,文字を,字,数字又は他の文字に分類する。字は,アルファベット的又は表音的である基本文字(一つ又は複数の結合文字が,後に続くこともある。),統合漢字から成る。 各クラスにおける実際の文字についての完全な定義は,文字クラスに関する付録に規定する。

Nameは,字又はいくつかの区切り文字の一つで始まり,その後に字,数字,ハイフン,下線,コロン又はピリオドが続く(これらを名前文字という。)。文字列"xml"又は(('X'|'x') ('M'|'m') ('L'|'l'))にマッチする任意の文字列で始まる名前は,この標準情報(TR)の現在の版又は将来の版での標準化のために予約する。

XMLの名前の中のコロンは,名前空間での実験のために予約する。コロンの意味は,将来のある時点で標準化するものとし,そのときには,実験的な目的でコロンを使用する文書を更新する必要が生じる可能性がある。XMLで採用する名前空間の機構が,区切り子として実際にコロンを使用するという保証はない。事実上,これは,名前空間の実験の一つとして以外には,XMLの名前の中でコロンを使用しないほうがよいことを意味する。しかし,XMLプロセサは,名前文字としてコロンを受け付けることが望ましい。

Nmtoken (名前トークン)は,名前文字で構成する列とする。

名前及びトークン
[4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender
[5] Name ::= (Letter | '_' | ':') (NameChar)*
[6] Names ::= Name (S Name)*
[7] Nmtoken ::= (NameChar)+
[8] Nmtokens ::= Nmtoken (S Nmtoken)*

リテラルデータは,引用符で囲まれた文字列とし,その列の区切り子として使用する引用符は含まない。リテラルは,内部実体(EntityValue),属性値(AttValue),外部識別子(SystemLiteral)の内容の指定に使用する。目的によっては,リテラル全体を,その中のマーク付けの走査を行なわずに,スキップすることがある(SkipLit。)。

リテラル
[9] EntityValue ::= ' " ' ([^%&"] | PEReference | Reference)* ' " '
| " ' " ([^%&'] | PEReference | Reference)* " ' "
[10] AttValue ::= ' " ' ([^<&"] | Reference)* ' " '
| " ' " ([^<&'] | Reference)* " ' "
[11] SystemLiteral ::= SkipLit
[12] PubidLiteral ::= ' " ' PubidChar* ' " ' | " ' " (PubidChar - " ' ")* " ' "
[13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?]
[14] SkipLit ::= (' " ' [^"]* ' " ') |" ' " [^']* " ' ")

2.4 文字データ及びマーク付け

テキストは,文字データ及びマーク付けが混在するものとして構成する。マーク付けは,開始タグ終了タグ空要素実体参照文字参照コメントCDATAセクション の区切り子,文書型宣言及び処理命令の形を取る。

マーク付けではないすべてのテキストは,文書の文字データを構成する。

アンパサンド文字 (&)及び不等号(小なり) (<)は,マーク付けの区切り子として,又はコメント処理命令若しくはCDATAセクション内で使用する場合にだけ,そのままの形で出現してよい。これらの文字は,内部実体宣言のリテラル実体値内に記述してもよい。 詳しくは,整形式の実体に関する規定を参照。これらの文字が他の部分で必要な場合,数値による文字参照又は文字列"&amp;"及び文字列"&lt;"を使用し,別扱いしなければならない。不等号(大なり) (>) は,文字列"&gt;"を使用して表現してもよい。内容の中で列"]]>"を使用するときは,それが,CDATAセクションの終了をマーク付けしない限り,互換性のため,"&gt;"又は文字参照を使用し,別扱いしなければならない。

要素の内容では,文字データは,いかなるマーク付けの開始区切り子を含まない任意の文字列とする。CDATAセクションでは,文字データとは,CDATAセクションの終了区切り子"]]>"を含まない任意の文字列とする。

属性値に一重引用符及び二重引用符を含むためには,アポストロフィ又は一重引用符(') は,"&apos;"として表現し,二重引用符(")は,"&quot;"として表現する。

文字データ
[15] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*)

2.5 コメント

コメントは,他のマーク付けの外ならば,文書のどこに現れてもよい。さらに,文書型宣言内で,文法が許す場所に現れてもよい。 コメントは,文書の文字データの一部ではない。XMLプロセサは,アプリケーションがコメントのテキストを取り出すことを可能としてもよいが,そうしなくともよい。 互換性のため,文字列"--" (二連ハイフン)は,コメント内で現れてはならない。

コメント
[16] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'

コメントの例を次に示す。

<!-- declarations for <head> & <body> -->

2.6 処理命令

処理命令(PI)によって,アプリケーションのための命令を文書に入れることができる。

処理命令
[17] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>'
[18] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))

PIは,文書の文字データの一部ではないが,アプリケーションに渡されなければならない。PIは,命令が渡されるアプリケーションを特定するために使用するターゲット (PITarget) で始まる。ターゲット名 "XML","xml"などは,この標準情報(TR)の現在の版又は将来の版の規格化用に予約する。XMLの記法機構を,PIのターゲットを宣言するために使用してもよい。

2.7 CDATAセクション

CDATAセクションは,文字データが出現するところであれば,どこに出現してもよい。これは,そうでなければ,マーク付けとして認識する文字を含む,テキストの区画を別扱いするのに使用する。CDATAセクションは,文字列"<![CDATA["で始まり,文字列 "]]>"で終わる。

CDATAセクション
[19] CDSect ::= CDStart CData CDEnd
[20] CDStart ::= '<![CDATA['
[21] CData ::= (Char* - (Char* ']]>' Char*))
[22] CDEnd ::= ']]>'

CDATAセクション内では,列CDEndだけをマーク付けとして認識するので,不等号(小なり)及びアンパサンドは,そのリテラル形式で出現してよい。それらは,"&lt;"及び"&amp;"を使用して別扱いする必要はない。CDATAセクションは,入れ子にはできない。

"<greeting>"及び"</greeting>"を,マーク付けではなく,文字データとして認識するCDATAセクションの例を,次に示す。

<![CDATA[<greeting>Hello, world!</greeting>]]>

2.8 前書き及び文書型宣言

XML文書は,使用するXMLの版を指定するXML宣言で始めてもよく,又そうするのが望ましい。

この標準情報(TR)のこの版に適合することを示すためには,版番号 "1.0" を使用しなければならない。ある文書が,この標準情報(TR)のこの版に適合しないとき,値"1.0"を使用するのは,エラーとする。この標準情報(TR)の今後の版に"1.0"以外の値を付与することが,XML作業グループの意図だが,XMLの将来の版を作成することの確約を示すわけではなく,作成したとしても,番号付けについて,特定の方法を使用することの確約を示すわけでもない。将来の版の可能性を除外しないので,必要な場合,自動的な版の認識を可能とする手段として,この構成子を提供する。プロセサは,サポートしていない版でラベル付けした文書を受け取ったとき,エラーを通知してもよい。

XML文書内のマーク付けの機能は,記憶構造及び論理構造を記述すること,並びに属性及び属性値の対を論理構造に関連づけることにある。XMLは,論理構造についての制約条件を定義するため,及びあらかじめ定義された記憶単位を使用できるための機構として,文書型宣言を提供する。XML文書が妥当とは,文書型宣言をもち,その文書型宣言に示す制約条件を満たすこととする。

文書型宣言は,文書の最初の要素の前に現れなければならない。

前書き
[23] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?
[24] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
[25] VersionInfo ::= S 'version' Eq ('"VersionNum"' | "'VersionNum'")
[26] Eq ::= S? '=' S?
[27] VersionNum ::= ([a-zA-Z0-9_.:] | '-')+
[28] Misc ::= Comment | PI | S

例えば,次に示す完全なXML文書は,整形式であるが妥当ではない。

<?xml version="1.0"?>
<greeting>Hello, world!</greeting>

次の文書も同様とする。

<greeting>Hello, world!</greeting>

XMLの文書型宣言は,ある文書クラスのための文法を提供するマーク付け宣言を含むか,又は参照する。この文法を,文書型定義又はDTDという。文書型宣言は,マーク付け宣言を含んだ外部サブセット(特別な種類の外部実体)を参照でき,又は内部サブセットに直接マーク付け宣言を含むこともできる。さらに,その両方も可能とする。ある文書のDTDは,両方のサブセットをまとめたものとして構成する。

マーク付け宣言は,要素型宣言属性リスト宣言実体宣言又は記法宣言とする。次に示す整形式制約及び妥当性制約に規定するが,これらの宣言は,パラメタ実体内に全体又は一部が含まれてもよい。詳しい規定は,物理構造に関する規定を参照のこと。

文書型定義
[29] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('[' (markupdecl | PEReference | S)* ']' S?)? '>' [ 妥当性制約: ルート要素型 ]
[30] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment [ 妥当性制約: 宣言及びパラメタ実体が厳密に入れ子をなすこと ]
[ 整形式制約: 内部サブセット内のパラメタ実体 ]

妥当性制約: ルート要素型
文書型宣言における
Nameは,ルート要素の型とマッチしなければならない。

妥当性制約: 宣言及びパラメタ実体が厳密に入れ子をなすこと
パラメタ実体
の置換テキストは,マーク付け宣言内において,厳密に入れ子になっていなければならない。つまり,マーク付け宣言(markupdecl)の最初又は最後の文字が,パラメタ実体参照の対象となる置換テキストに含まれれば,両方とも同じ置換テキストに含まれなければならない。

整形式制約 - 内部サブセット内のパラメタ実体
DTDの内部サブセットでは,
パラメタ実体参照は,マーク付け宣言が出現可能な場所だけに出現できる。マーク付け宣言内には出現できない(この制約は,外部パラメタ実体又は外部サブセットでの参照には適用しない。)。

内部サブセットのときと同様に,外部サブセット及びDTDにおいて参照する任意の外部パラメタ実体は,非終端記号markupdeclによって許される型の,一連の完全なマーク付け宣言で構成されなければならない。マーク付け宣言の間には,空白又はパラメタ実体参照を置いてもよい。しかし,外部サブセット又は外部パラメタ実体の内容の一部は,条件付きセクションを使用して無視してもよい。内部サブセットでは,これは許されない。

外部サブセット
[31] extSubset ::= ( markupdecl | conditionalSect | PEReference | S )*

外部サブセット及び外部パラメタ実体は,その内では,パラメタ実体がマーク付け宣言のだけでなく,マーク付け宣言のでも認識される,という点でも内部サブセットとは異なる。

文書型宣言付きのXML文書の例を,次に示す。

<?xml version="1.0"?>
<!DOCTYPE greeting SYSTEM "hello.dtd">
<greeting>Hello, world!</greeting>

システム識別子 "hello.dtd"が,文書のDTDのURIとなる。

次の例のとおり,宣言を局所的に与えることもできる。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE greeting [
  <!ELEMENT greeting (#PCDATA)>
]>
<greeting>Hello, world!</greeting>

外部サブセット及び内部サブセットの両方を使用するときは,内部サブセットが外部サブセットより先に出現したと見なす。これは,内部サブセットの実体及び属性リスト宣言が,外部サブセットの実体及び属性リスト宣言より優先するという効果をもたらす。

2.9 スタンドアロン文書宣言

XMLプロセサは,アプリケーションに文書の内容を渡すが,マーク付け宣言は,この内容に影響を与えることがある。属性のデフォルト値及び実体宣言をその例とする。XML宣言の一部分として出現できるスタンドアロン文書宣言は,文書が,そのマーク付け宣言の存在によって影響されないことを指し示す(普通,そのマーク付け宣言が存在しないために,これがいえる。)。

スタンドアロン文書宣言
[32] SDDecl ::= S 'standalone' Eq "'" ('yes' | 'no') "'"
| S 'standalone' Eq '"' ('yes' | 'no') '"' [ 妥当性制約: スタンドアロン文書宣言 ]

スタンドアロン文書宣言においては, "yes"の値は,文書実体の外部に(DTDの外部サブセット内に,又は内部サブセットから参照される外部パラメタ実体内に),XMLプロセサからアプリケーションへと渡される情報に影響するマーク付け宣言が存在しないことを意味する。"no"の値は,その外部マーク付け宣言が存在するか,又は存在する可能性があることを意味する。スタンドアロン文書宣言は,その宣言が文書外部に存在するかどうかを示すだけに注意すること。外部実体への参照が文書内に存在していても,その実体が内部的に宣言されているときは,文書のスタンドアロンの状態には影響を与えない。

外部にマーク付け宣言が存在しなければ,スタンドアロン文書宣言は意味をもたない。外部にマーク付け宣言が存在し,スタンドアロン文書宣言が存在しない場合は,"no" の値の設定を仮定する。

XML文書で standalone="no" が設定されているものは,あるアルゴリズムでスタンドアロン文書に変換でき,この文書は,ネットワーク配信アプリケーションにとって望ましいかもしれない。

妥当性制約: スタンドアロン文書宣言
スタンドアロン文書宣言は,何らかの外部マーク付け宣言が次のいずれかを宣言しているときは,値 "no" を取らなければならない。

スタンドアロン文書宣言付きのXML宣言の例を,次に示す。

<?xml version="1.0" standalone='yes'?>

2.10 空白の取扱い

XML文書を編集するときは,マーク付けを目立たせ読みやすくするために,“空白”(スペース,タブ及び空白行。この情報標準(TR)では,非終端記号のSで表す。)を使うと便利なことが多い。その空白は,配布する版の文書の一部として含めることを意図しないのを普通とする。しかし,“意味のある”空白であって,配布する版に残さなければならないものも多い。例えば,詩及びソースコードにおける空白がある。

XMLプロセサは,文書内のマーク付け以外のすべての文字を,そのまま変更せずにアプリケーションに渡さなければならない。妥当性を検証するXMLプロセサは,要素内容の中の空白を他の非マーク付け文字から区別し,アプリケーション側に要素内容の中の空白が重要でないということを伝えなければならない。

"xml:space"という特別な属性を文書に挿入することによって,空白を重要とする意図を示してもよい。この属性を適用する要素に現れる空白を,アプリケーションが重要なものとして扱うことを要求する,という意図を示す。

妥当な文書では,この属性を使用する場合は,他の属性と同じように宣言しなければならない。宣言するときは,取り得る値を"default"及び "preserve"だけとする列挙型でなければならない。

値"default"は,アプリケーションのデフォルトの空白処理モードを,その要素に適用可能とすることを意味する。値"preserve"は,アプリケーションがすべての空白を保存することを意味する。この宣言の意図は,"xml:space" 属性の別の指定で上書きしない限り,要素の内容に現れるすべての要素に適用すると解釈する。

文書のルート要素については,この属性の値を指定するか,又はこの属性のデフォルト値がある場合を除いては,アプリケーションによる空白の取扱いについて,いかなる意図も示さないと解釈する。

例を次に示す。

    <!ATTLIST poem   xml:space (default|preserve) 'preserve'>

2.11 行末の取扱い

XMLの構文解析対象実体は,通常コンピュータのファイル内に保存され,編集の便宜のために複数の行に分けることが多い。これらの行は,普通は,CR (#xD)コード及び LF (#xA)コードの何らかの組合せによって分けられる。

アプリケーションの処理を簡単にするため,外部解析対象実体又は内部解析対象実体のリテラル実体値が,"#xD#xA" の2文字の連続とするリテラル又は#xDの単独のリテラルを含む場合に,XMLプロセサは,アプリケーションに単一の文字#xAだけを渡さなければならない(この処理は,入力内に存在する改行コードを構文解析の前に正規化することによって,容易に実現できる。)。

2.12 言語識別

文書処理においては,その文書の中身がどんな自然言語又は形式言語で書かれているか明示することが,役に立つことが多い。

XML文書内の要素のもつ内容又は属性値において使用する言語を指定するために,"xml:lang" という名前の特別な属性を,文書内に挿入してもよい。 属性の値は,[RFC1766]“RFC1766:言語識別のためのタグ”によって規定される言語識別コードに従う。

言語識別
[33] LanguageID ::= Langcode ('-' Subcode)*
[34] Langcode ::= ISO639Code | IanaCode | UserCode
[35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z])
[36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+
[37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+
[38] Subcode ::= ([a-z] | [A-Z])+

Langcodeは,次のどれでもよい。

Subcodeは,複数回使ってもよい。最初のサブコードが存在し,その内容が二つの文字から成るときは,[ISO3166]ISO3166の“国名を表すコード(国コード)”でなければならない。最初のサブコードが3文字以上から成るときは,Langcodeの先頭が,"x-" 又は "X-"で始まらない限り,指定した言語に対するサブコードとし,IANAに登録されたものでなければならない。

言語コードは,小文字での表記を,国コードは,(存在するならば)大文字での表記を慣行とする。しかし,XML文書内における他の名前とは異なり,これらの値については,大文字及び小文字の区別をしないことに注意すること。

例を次に示す。

<p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
<p xml:lang="en-GB">What colour is it?</p>
<p xml:lang="en-US">What color is it?</p>
<sp who="Faust" desc='leise' xml:lang="de">
  <l>Habe nun, ach! Philosophie,</l>
  <l>Juristerei, und Medizin</l>
  <l>und leider auch Theologie</l>
  <l>durchaus studiert mit heißem Bemüh'n.</l>
  </sp>

xml:langで宣言する意図は,xml:langの別の指定で上書しない限り,指定した要素の内容に含むすべての要素に適用する。

妥当な文書においては,この標準情報(TR)の他の場所で規定するとおり,この属性を必ず宣言しなければならない。通常,宣言は,次の形とする。

xml:lang  NMTOKEN  #IMPLIED

必要ならば,特定のデフォルト値を与えてもよい。英語を母語とする学生用のフランス語の詩集では,説明及び注を英語で記述すれば,xml:lang 属性を次のとおりに宣言することとなる。

    <!ATTLIST poem   xml:lang NMTOKEN 'fr'>
    <!ATTLIST gloss  xml:lang NMTOKEN 'en'>
    <!ATTLIST note   xml:lang NMTOKEN 'en'>

3. 論理構造

いかなるXML文書も,一つ以上の要素を含む。要素の境界は, 開始タグ及び終了タグによって区切る。要素が要素のときは,空要素タグで示す。各々の要素は,型をもつ。要素型は名前(共通識別子(generic identifier)又はGIと呼ぶことがある。)によって特定される。要素は,いくつかの属性をもつことができる。属性は,名前及びをもつ。

要素
[39] element ::= EmptyElemTag
| STag content ETag [ 整形式制約: 要素型のマッチ ]

この標準情報(TR)は,要素型及び属性の意味,使用方法,又は(構文に関することを除き)名前に制約を与えない。ただし,先頭が(('X'|'x')('M'|'m')('L'|'l'))にマッチする名前は,この版又は今後の版のこの標準情報(TR)での標準化のために予約する。

整形式制約 - 要素型のマッチ
要素の終了タグの
名前は,その要素の開始タグにおける型とマッチしなければならない。

3.1 開始タグ,終了タグ及び空要素タグ

空でない任意のXML要素の始まりは,開始タグによってマーク付けする。

開始タグ
[40] STag ::= '<' Name (S Attribute)* S? '>' [ 整形式制約: 属性指定の一意性 ]
[41] Attribute ::= Name Eq AttValue [ 妥当性制約: 属性値の型 ]
[ 整形式制約: 外部実体への参照がないこと ]
[ 整形式制約: 属性値に<を含まないこと ]

開始タグ及び終了タグ内のNameは,要素のを表わす。Name及びAttValueの対を要素の属性指定といい,個々の対におけるNameは,属性名及びAttValueの内容(区切り子'又は"の間の文字列)を属性値という。

整形式制約 - 属性指定の一意性
開始タグ又は空要素タグでは,同一の属性名が2度以上出現してはならない。

妥当性制約:属性値の型
属性は宣言されていなければならない。属性値の型は,その属性に対して宣言した型でなければならない(属性の型については,
属性リスト宣言についての規定を参照。)。

整形式制約 - 外部実体への参照がないこと
属性値には,外部実体への直接的又は間接的な参照を含むことはできない。

整形式制約 - 属性値に<を含まないこと
属性値内で直接的又は間接的に参照する実体(&lt;を除く。)の
置換テキストには,<を含んではならない。

開始タグの例を,次に示す。

<termdef id="dt-dog" term="dog">

開始タグで始まる要素の終わりは,終了タグでマーク付けしなければならない。この終了タグは,対応する開始タグの要素型と同じ名前をもつ。

終了タグ
[42] ETag ::= '</' Name S? '>'

終了タグの例を,次に示す。

</termdef>

要素の開始タグと終了タグとの間のテキストを,その要素の内容という。

要素の内容
[43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*

要素がのとき,その要素は,直後に終了タグをもつ開始タグ又は空要素タグで表現しなければならない。空要素タグは,次の特別な形式をとる。

空要素のためのタグ
[44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' [ 整形式制約: 属性指定の一意性 ]

空要素タグは,内容をもたない任意の要素の表現に利用できる。空要素タグで表現する要素を,キーワードEMPTYを用いて宣言しなくともよい。

空要素の例を,次に示す。

<IMG align="left" src="http://www.w3.org/Icons/WWW/w3c_home" />
</br><br/>

3.2 要素宣言

妥当性を保証するため,要素宣言及び属性リスト宣言を用いてXML文書要素の構造に,制約を加えることができる。

要素宣言は,要素の内容についての制約とする。

要素宣言は,要素のとして出現可能な要素型について,制約を加えることが多い。ユーザのオプション指定によっては,要素宣言をもたない要素型が他の要素宣言によって参照されれば,XMLプロセサは,警告を出してもよい。しかし,これはエラーとはしない。

要素型宣言は,次の形式をとる。

要素型宣言
[45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>' [ 妥当性制約: 要素宣言の一意性 ]
[46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children [ 妥当性制約: 要素の妥当性 ]

ここで,Nameは,宣言されている要素の型とする。

妥当性制約:要素宣言の一意性
要素型を2度以上宣言できない。

妥当性制約:要素の妥当性
要素が妥当とは,
elementdeclにマッチする宣言であって,そのNameがその要素型とマッチし,次のいずれかの条件を満たす場合とする。

要素宣言の例を,次に示す。


<!ELEMENT br EMPTY>
<!ELEMENT p (#PCDATA|emph)* >
<!ELEMENT %name.para; %content.para; >
<!ELEMENT container ANY>

3.2.1 要素内容

ある型の要素が要素だけを含む(文字データを含まない。)とき,その要素は,要素内容をもつ,という。この場合,制約は,内容モデルを含む。内容モデルは,子要素の型及び子要素の出現順序を制御する簡単な文法とする。この文法は,内容素子(cps)からなる。内容素子は,名前,内容素子の選択リスト又は内容素子の列リストから構成される。

要素内容モデル
[47] children ::= (choice | seq) ('?' | '*' | '+')?
[48] cp ::= (Name | choice | seq) ('?' | '*' | '+')?
[49] choice ::= '(' S? cp ( S? '|' S? cp )*S? ')' [ 妥当性制約: グループ及びパラメタ実体が厳密な入れ子をなしていること ]
[50] seq ::= '(' S? cp ( S? ',' S? cp )*S? ')' [ 妥当性制約: グループ及びパラメタ実体が厳密な入れ子をなしていること ]

ここで,Nameは,として出現してよい要素の型を示す。この文法で選択リストが現れる位置では,選択リスト内のいずれの内容素子も要素内容の中に現れてよい。列リストに現れる内容素子は,リストで指定する順番のとおりに,要素内容に現れなければならない。名前又はリストの後に出現するオプションの文字は,リスト内の要素又は内容素子が,1回以上任意の回数(+),0回以上任意の回数(*)又は0回若しくは1回(?)出現可能なことを規定する。ここで示す構文及び意味は,この標準情報(TR)における生成規則で用いるものと同一とする。

要素の内容が内容モデルにマッチするのは,列,選択及び繰返し演算子にしたがって,内容の中の要素と内容モデル内の要素型とをマッチさせながら,内容モデル内の一つのパスをたどれるときに限る。互換性のため,文書内の要素が,内容モデルにおける要素型の複数の出現位置とマッチすることは,エラーとする。詳細な規定については,附属書の決定的内容モデルの項を参照。

妥当性制約: グループ及びパラメタ実体が厳密な入れ子をなしていること
パラメタ実体の
置換テキストは,かっこで囲まれたグループによって,厳密な入れ子を構成しなければならない。つまり,選択又は混在部品に,開きかっこ又は閉じかっこのいずれか一方がパラメタ実体の置換テキストに含れれば,他方も同じ置換テキストに含まれなければならない。 相互運用性のため,パラメタ実体参照が選択又は混在内容に含まれれば,その置換テキストは空でないことが望ましく,置換テキストの先頭及び末尾の空白でない文字は,コネクタ(|又は,)でない方がよい。

要素内容モデルのいくつかの例を,次に示す。

<!ELEMENT spec (front, body, back?)>
<!ELEMENT div1 (head, (p | list | note)*, div2*)>
<!ELEMENT dictionary-body (%div.mix; | %dict.mix;)*>

3.2.2 混合内容

ある要素型の要素内に,要素に混在して文字データが含まれる可能性があるとき,その要素は,混合内容をもつという。この場合,子要素の型についての制約が存在してもよいが,子要素の順序又は出現回数についての制約はないとする。

混合内容宣言
[51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*'
| '(' S? '#PCDATA' S? ')' [ 妥当性制約: グループ及びパラメタ実体が厳密な入れ子をなしていること ]
[ 妥当性制約: 要素型の重複の禁止 ]

ここで,Nameは,子として出現してもよい要素の型を示す。

妥当性制約: 要素型の重複の禁止
一つの混合内容宣言内に,同じ名前が複数回出現してはならない。

混合内容宣言の例を,次に示す。

<!ELEMENT p (#PCDATA|a|ul|b|i|em)*>
<!ELEMENT p (#PCDATA | %font; | %phrase; | %special; | %form;)* >
<!ELEMENT b (#PCDATA)>

3.3 属性リスト宣言

属性は,名前及び値の対を要素に関連付けるために用いる。属性指定は,開始タグ又は空要素タグ内でだけ可能とする。したがって,属性を認識するための生成規則は,開始タグについての規定で示す。属性リスト宣言は,次の目的で用いる。

属性リスト宣言は,ある要素型と関連付けられた各属性に対し,名前,データ型及び(存在すれば)デフォルト値を規定する。

属性リスト宣言
[52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>'
[53] AttDef ::= S Name S AttType S Default

AttlistDecl規則に存在するNameは,要素型の名前とする。ユーザのオプション指定によっては,宣言していない要素型に対し属性を宣言したならば,XMLプロセサは,警告を出してもよい。しかし,これはエラーとはしない。 AttDef規則におけるNameは,属性の名前とする。

ある要素に対して,複数のAttlistDeclを与える場合,これらすべての内容はマージする。ある要素型の同じ属性に,複数の定義を与える場合には,最初の宣言を有効とし,他の宣言は無視する。相互運用性のために,DTDの作成者は,ある要素型には高々一つの属性リスト宣言しか与えない,ある属性名には高々一つの属性定義しか与えない,及びすべての属性リスト宣言には少なくとも一つの属性定義を与える,という選択をしてもよい。相互運用性のために,XMLプロセサは,ユーザのオプション指定によっては,ある要素型に複数の属性リスト宣言を与えたり,ある属性に複数の属性定義を与えたりしたときに,警告を出してもよい。しかし,これは,エラーとはしない。

3.3.1 属性の型

XMLの属性の型は,3種類とする。これらは,文字列型,トークン化型及び列挙型とする。文字列型は,値として任意の文字列をとる。トークン化型は,次に示す字句及び意味に関する様々な制約をもつ。

Attribute Types
[54] AttType ::= StringType | TokenizedType | EnumeratedType
[55] StringType ::= 'CDATA'
[56] TokenizedType ::= 'ID' [ 妥当性制約: ID ]
[ 妥当性制約: 1要素ごとに1ID ]
[ 妥当性制約: ID属性のデフォルト ]
| 'IDREF' [ 妥当性制約: IDREF ]
| 'IDREFS' [ 妥当性制約: IDREF ]
| 'ENTITY' [ 妥当性制約: 実体名 ]
| 'ENTITIES' [ 妥当性制約: 実体名 ]
| 'NMTOKEN' [ 妥当性制約: 名前トークン ]
| 'NMTOKENS' [ 妥当性制約: 名前トークン ]

妥当性制約: ID
この型の値は,生成規則Nameにマッチしなければならない。一つのXML文書内では,一つの名前が,この型の値として複数回現れてはならない。つまり,IDの値は,要素を一意に特定するしなければならない。

妥当性制約: 1要素ごとに1ID
要素型は,複数のID属性値をもってはならない。

妥当性制約: ID属性のデフォルト
ID属性は,デフォルトとして,#IMPLIED又は#REQUIREDを宣言しなければならない。

妥当性制約: IDREF
IDREF型の値は,生成規則
Nameにマッチしなければならない。IDREFS型の値は,生成規則Namesにマッチしなければならない。各々のNameは,XML文書内に存在する要素のID属性の値とマッチしなければならない。つまり,IDREFの値は,あるID属性の値とマッチしなければならない。

妥当性制約: 実体名
ENTITY型の値は,生成規則
Nameにマッチしなければならない。ENTITIES型の値は,生成規則Namesにマッチしなければならない。各々のNameは,DTDで宣言する解析対象外実体とマッチしなければならない。

妥当性制約: 名前トークン
NMTOKEN型の値は,非終端記号
Nmtokenとマッチする文字列から構成されなければならない。NMTOKENS型の値は,非終端記号Nmtokensとマッチする文字列から構成されなければならない。

XMLプロセサは,アプリケーションに属性値を渡す前に,属性値の正規化で規定するとおりに,属性値を正規化しなければならない。

列挙型の属性は,宣言した値の一つを取ることができる。列挙型には,2種類ある。

列挙属性の型
[57] EnumeratedType ::= NotationType | Enumeration
[58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' Name)* S? ')' [ 妥当性制約: 記法属性 ]
[59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' [ 妥当性制約: 列挙 ]

妥当性制約: 記法属性
この型の値は,宣言している
記法の名前の一つとマッチしなければならない。つまり,宣言に存在する記法名は,すべて宣言されていなければならない。

妥当性制約: 列挙
この型の値は,宣言に存在する
Nmtokenトークンの一つとマッチしなければならない。

相互運用性のため,同じNmtokenは,単一要素型の列挙型の属性として,複数回現れない方がよい。

3.3.2 属性のデフォルト

属性宣言は,属性の指定が必須かどうかについての情報を与える。必須でない場合には,文書内で属性を指定しないとき,XMLプロセサの処理方法の情報も与える。

属性のデフォルト
[60] Default ::= '#REQUIRED' |#IMPLIED'
| (('#FIXED' S)? AttValue) [ 妥当性制約: 属性デフォルトの正しさ ]
[ 整形式制約: 属性値に<を含まないこと ]

妥当性制約: 属性デフォルトの正しさ
宣言したデフォルト値は,宣言した属性型の字句制約を満たさなければならない。

#REQUIREDを指定したとき,この要素型の開始タグであって,この属性に値を与えないものをXMLプロセサが見つけたならば,その文書は妥当とはしない。#IMPLIEDを指定したとき,この属性を省略したら,XMLプロセサは,属性値を指定しないことをアプリケーションに伝えなければならない。このとき,アプリケーションの振舞いについての制約はない。

属性が#REQUIREDでも#IMPLIEDでもないときには,AttValueの値が,デフォルト値となる。#FIXEDの場合,デフォルト値と異なる値が指定されれば,その文書は,妥当としない。デフォルト値を宣言している場合,この属性の省略を見つけたら,宣言したデフォルト値を属性値に指定しているとして,XMLプロセサは振る舞うことが望ましい。

属性リスト宣言の例を,次に示す。

<!ATTLIST termdef
          id      ID      #REQUIRED
          name    CDATA   #IMPLIED>
<!ATTLIST list
          type    (bullets|ordered|glossary)  "ordered">
<!ATTLIST form
          method  CDATA   #FIXED "POST">

3.3.3 属性値の正規化

XMLプロセサは,属性値をアプリケーションに渡す前に,次のとおりに正規化しなければならない。

妥当性を検証しないパーサは,宣言が見つからない属性は,すべて,CDATAを宣言しているとして扱うことが望ましい。

3.4 条件付きセクション

条件付きセクションとは,文書型宣言の外部サブセットの一部とし,制御キーワードの指定によって,DTDの論理構造に含めたり,除いたりする部分とする。

条件付きセクション
[61] conditionalSect ::= includeSect | ignoreSect
[62] includeSect ::= '<![' S? 'INCLUDE' S? '[' extSubset ']]>'
[63] ignoreSect ::= '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>'
[64] ignoreSectContents ::= Ignore ('<![' ignoreSectContents ']]>' Ignore)*
[65] Ignore ::= Char* - (Char* ('<![' | ']]>') Char*)

条件付きセクションは,DTDの内部サブセット及び外部サブセットと同様に,完全な宣言,コメント又は入れ子になった条件付きセクションを,いくつか含んでよい。これらの間に,空白が現れてもよい。

条件付きセクションのキーワードがINCLUDEならば,XMLプロセサは,この条件付きセクションの内容を,文書の一部として扱わなければならない。条件付きセクションのキーワードがIGNOREならば,その条件付きセクションの内容は,文書の一部として扱わない。構文解析を正しく行うためには,無視する条件付きセクション(IGNORE)に関しても,内容を読まなければならないことに注意すること。これは,入れ子になった条件付きセクションを見つけ,(無視する)最も外側の条件付きセクションを正しく検出するためとする。キーワードをINCLUDEとする小さな条件付きセクションが,キーワードをIGNOREとするより大きな条件付きセクションに含まれるならば,外側及び内側の条件付きセクションの両方とも無視する。

条件付きセクションのキーワードがパラメタ実体参照ならば,XMLプロセサは条件付きセクションの扱いを判断する前に,このパラメタ実体を展開しなければならない。

例を次に示す。

<!ENTITY % draft 'INCLUDE' >
<!ENTITY % final 'IGNORE' >
 
<![%draft;[
<!ELEMENT book (comments*, title, body, supplements?)>
]]>
<![%final;[
<!ELEMENT book (title, body, supplements?)>
]]>

4. 物理構造

XML文書は,一つ以上の記憶単位から構成する。この記憶単位を,実体という。実体は,内容をもち,文書実体(以降参照)及び外部DTDサブセットを除いて,名前で特定される。 各XML文書は,文書実体と呼ぶ実体を一つもつ。XMLプロセサは,この文書実体から処理を開始する。文書実体が,文書のすべてを含んでもよい。

実体は,解析対象実体又は解析対象外実体とする。解析対象実体の内容は,解析対象実体の置換テキストと呼ぶ。このテキストは,文書の本体の一部として解釈する。

解析対象外実体は,内容がテキストでもそうでなくともよいリソースとする。テキストの場合,XMLでなくともよい。各解析対象外実体には,記法が関連付けられ,この記法は,名前で特定される。記法の名前及び関連付けられた識別子を,XMLプロセサがアプリケーションに渡すという要件以外は,XMLは,解析対象外実体の内容を制限しない。

解析対象実体は,実体参照によって名前で呼び出す。解析対象外実体は,ENTITY型又はENTITIES型の属性の値として,名前で参照する。

一般実体は,文書内容の中で使用する解析対象実体とする。あいまいにならない限り,この標準情報(TR)では,一般実体を単に実体と呼ぶ。パラメタ実体は,DTD内で使用する解析対象実体とする。これらの2種類の実体は,異なる書式で参照し,異なる文脈で認識する。

4.1 文字参照及び実体参照

文字参照は,ISO/IEC 10646文字集合の特定の文字,例えば,入力機器から直接入力不可能な文字を参照する。

文字参照
[66] CharRef ::= '&#' [0-9]+ ';'
| '&#x' [0-9a-fA-F]+ ';' [ 整形式制約: 正当な文字 ]

整形式制約 - 正当な文字
文字参照で参照する文字は,非終端記号
Charに従わなければならない。

文字が "&#x" で始まれば,終端の ";" までの数字及びアルファベットは,ISO/IEC 10646 の文字コードの16進数表現とする。 文字が "&#" で始まれば,終端の ";" までの数字は,文字コードの10進数表現とする。

実体参照は,名前の付いた実体の内容を参照する。一般実体への参照は,アンパサンド(&)及びセミコロン(;)を区切り子として用いる。パラメタ実体への参照は,パーセント記号(%)及びセミコロン(;)を区切り子として用いる。

実体参照
[67] Reference ::= EntityRef | CharRef
[68] EntityRef ::= '&' Name ';' [ 整形式制約: 実体が宣言されていること ]
[ 妥当性制約: 実体が宣言されていること ]
[ 整形式制約: 解析対象実体 ]
[ 整形式制約: 再帰なし ]
[69] PEReference ::= '%' Name ';' [ 整形式制約: 実体が宣言されていること ]
[ 妥当性制約: 実体が宣言されていること ]
[ 整形式制約: 解析対象実体 ]
[ 整形式制約: 再帰なし ]
[ 整形式制約: DTDの中 ]

整形式制約 - 実体が宣言されていること
DTDをもたない文書,パラメタ実体参照を含まない内部DTDサブセットだけをもつ文書,又は "standalone='yes'" をもつ文書において,実体参照で用いる
Name は,その実体の宣言で与える名前と,マッチしなければならない。ただし,整形式の文書は,実体amp, lt, gt, apos, quot を宣言する必要はない。パラメタ実体の場合は,宣言は,参照に先行しなければならない。同様に,一般実体の場合は,属性リスト宣言のデフォルト値内での参照より先に,宣言が現れなければならない。 外部サブセット又は外部パラメタ実体で実体を宣言するとき,妥当性を検証しないプロセサが,宣言を読み,処理することを義務づけない。それらの文書では,実体は宣言されなければならないという規則は,整形式制約ではない。

妥当性制約: 実体が宣言されていること
外部サブセット又は外部パラメタ実体をもっていて,"standalone='no'"をもつ文書において,実体参照で用いる
Name は,その実体の宣言で与える名前とマッチしなければならない。相互運用性のため,妥当な文書はあらかじめ定義した実体の規定で指定した書式によって,実体 amp, lt, gt, apos, quotを宣言することが望ましい。パラメタ実体の場合は,宣言は,参照に先行しなければならない。同様に,一般実体の場合は,属性リスト宣言のデフォルト値内での参照よりも先に,宣言が現れなければならない。

整形式制約 - 解析対象実体
実体参照は,
解析対象外実体の名前を含んでいてはならない。解析対象外実体は,ENTITY型又はENTITIES 型として宣言した属性値としてだけ参照できる。

整形式制約 - 再帰なし
解析対象実体は,それ自体への参照を,直接にも間接にも含んではならない。

整形式制約 - DTDの中
パラメタ実体参照は,
DTD内にだけ,出現してよい。

文字参照及び実体参照の例を,次に示す。

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

パラメタ実体参照の例を,次に示す。

<!ENTITY % ISOLat2
         SYSTEM "http://www.xml.com/iso/isolat2-xml.entities" >
%ISOLat2;

4.2 実体宣言

実体は,次のとおりに宣言する。

実体宣言
[70] EntityDecl ::= GEDecl /* 一般実体 */
| PEDecl /* パラメタ実体 */
[71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>'
[72] PEDecl ::= | '<!ENTITY' S '%' S Name S PEDef S? '>' /* パラメタ実体 */
[73] EntityDef ::= EntityValue
| ExternalDef
[74] PEDef ::= EntityValue | ExternalID

Name は,実体参照において実体を特定する。解析対象外実体ならば,ENTITY 型又はENTITIES型の属性値内で,実体を特定する。同一の実体が一回以上宣言されれば,最初の宣言を用いる。ユーザのオプション指定によっては,複数回宣言される実体に関し,XMLプロセサは,警告を出してもよい。

4.2.1 内部実体

実体の定義が EntityValueのとき,これを内部実体という。これは,別個の物理的記憶単位をもたず,実体の内容は,宣言内で与える。正しく置換テキストを生成するには,リテラル実体値内での実体参照及び文字参照の処理が,必要となるかもしれないことに注意する。詳細は,内部実体の置換テキストの構築を参照。

内部実体は,解析対象実体とする。

内部実体宣言の例を,次に示す。

<!ENTITY Pub-Status "This is a pre-release of the specification.">

4.2.2 外部実体

実体が内部実体でなければ,外部実体とし,次のとおりに宣言する。

外部実体宣言
[75] ExternalDef ::= ExternalID NDataDecl?
[76] ExternalID ::= 'SYSTEM' S SystemLiteral
| 'PUBLIC' S PubidLiteral S SystemLiteral
[77] NDataDecl ::= S 'NDATA' S Name [ 妥当性制約: 記法が宣言されていること ]

NDataDecl が存在すれば,この実体は,解析対象外実体とし,そうでなければ,解析対象実体とする。

妥当性制約: 記法が宣言されていること
Name は,宣言した記法の名前とマッチしなければならない。

キーワード SYSTEM の後の SystemLiteral を,実体のシステム識別子と呼ぶ。これはURIとし,その実体の内容を取り出すのに用いてもよい。URIと共に使うことの多いハッシュ("#")及びフラグメント識別子は,正式には,URI自体の一部とはしない。フラグメント識別子が,システム識別子の部分として与えられている場合,XMLプロセサは,エラーを出してもよい。この標準情報(TR)の範囲外の情報(例えば,ある特定のDTDの特別なXML要素又は特定のアプリケーションの仕様によって定義された処理命令)によって上書きされない限り,相対的なURIは,その実体の位置,すなわち,その実体の宣言があるファイルに相対的とする。したがって,DTDの内部サブセットにある実体宣言での相対的なURIは,文書の位置について相対的とする。外部サブセットにある実体宣言での相対的なURIは,その外部サブセットを含むファイルの位置に相対的とする。

システム識別子以外に,外部実体は,公開識別子を含んでもよい。 実体の内容を取り出すXMLプロセサは,この公開識別子を用いて,代わりのURIの生成を試みてもよい。XMLプロセサがこれに失敗した場合は,システムリテラルとして指定したURIを用いなければならない。マッチする前に,公開識別子内にある空白文字からなる文字列は,すべて単一のスペース文字(#x20)に正規化しなければならず,前後の空白文字は削除しなければならない。

外部実体宣言の例を,次に示す。

<!ENTITY open-hatch
         SYSTEM "http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY open-hatch
         PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN"
         "http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY hatch-pic
         SYSTEM "../grafix/OpenHatch.gif"
         NDATA gif >

4.3 解析対象実体

4.3.1 テキスト宣言

外部解析対象実体は,テキスト宣言で始まってもよい。

テキスト宣言
[78] TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>'

テキスト宣言は,そのままの形で現れなければならず,解析対象実体への参照を経由してはならないことに注意する。

外部解析対象実体において,テキスト宣言は,先頭以外のいかなる位置にも出現しない。

4.3.2 整形式の解析対象実体

ラベルdocumentをもつ生成規則にマッチすれば,文書実体は,整形式とする。ラベルExtParsedEntをもつ生成規則にマッチすれば,外部の一般解析対象実体は,整形式とする。ラベルExtPEをもつ生成規則にマッチすれば,外部パラメタ実体は,整形式とする。

整形式の解析対象実体
[79] ExtParsedEnt ::= TextDecl? content
[80] ExtPE ::= TextDecl? extSubset

置換テキストが,ラベルcontentをもつ生成規則にマッチすれば,内部の一般解析対象実体は,整形式とする。DTDを最後まで読み込まないと,確実にこれを判定できないことに注意。すべての内部のパラメタ実体は,定義によって整形式とする。

実体が整形式な結果として,XML文書の論理的及び物理的構造は,正しく入れ子となる。開始タグ終了タグ空要素タグ要素コメント処理命令文字参照及び実体参照が,一つの実体で開始し,別の実体で終了することはない。

4.3.3 実体における文字符号化

XML文書内の外部解析対象実体は,各々,別の文字符号化方式を用いてもよい。すべてのXMLプロセサは,UTF-8で符号化した実体,UTF-16で符号化した実体を処理できなければならない。

UTF-16で符号化した実体は,ISO/IEC 10646の付録E及びUnicodeの付録Bで規定するバイト順マーク(ZERO WIDTH NO-BREAK SPACE文字,#xFEFF)で始まらなければならない。これは,符号化の標識であって,XML文書のマーク付けの一部でも,文字データの一部でもない。XMLプロセサは,UTF-8で符号化した文書とUTF-16で符号化した文書との区別を行うために,この文字を使用可能でなければならない。

XMLプロセサは,UTF-8及びUTF-16で符号化した実体だけを読むことを必須とするが,他の符号化を世界では用いており,それらの符号化を用いる実体をXMLプロセサが処理できることが望ましい。UTF-8又はUTF-16以外の符号化方式を用いて格納する解析対象実体は,符号化宣言を含むテキスト宣言で始めなければならない。

符号化宣言
[81] EncodingDecl ::= S 'encoding' Eq '"' EncName '"' | "'" EncName "'"
[82] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')* /* ラテン文字だけを含む符号化名 */

文書実体では,符号化宣言は,XML宣言の一部とする。EncNameは,使用する符号化方式の名前とする。

符号化宣言では,値UTF-8UTF-16ISO-10646-UCS-2及びISO-10646-UCS-4は,Unicode及びISO/IEC 10646の各種符号化のために用いる。値ISO-8859-1からISO-8859-9までは,ISO 8859の対応するパートのために用いる。値ISO-2022-JPShift_JIS及びEUC-JPは,JIS X-0208-1997の各種符号化のために用いる。XMLプロセサは,それ以外の符号化方式を認識してもよい。Internet Assigned Numbers Authority (IANA)に,(charsetsとして)登録された文字符号化方式については,これら以外についても,登録された名前で参照することが望ましい。これらの登録された名前は,大文字・小文字の区別をせずに定義されているので,これらに対する比較を試みるプロセサは,大文字・小文字の区別をしない方法をとるのが望ましいことに注意する。

XML処理系に渡された実体が,符号化宣言を含むにもかかわらず,宣言で示したもの以外の方式で符号化されていたり,符号化宣言が,外部実体の最初以外の位置に出現すれば,エラーとする。

バイト順マークでも符号化宣言でも始まらない実体は,UTF-8符号化でなければならない。

処理できない符号化をもった実体をXMLプロセサが発見したときは,アプリケーションにその事実を通知し,致命的エラーとして,処理を終了しなければならない。

符号化宣言の例を,次に示す。

<?xml encoding='UTF-8'?>
<?xml encoding='EUC-JP'?>

4.4 XMLプロセサによる実体及び参照の扱い

次の表は,文字参照,実体参照及び解析対象外実体の呼出しが現れる文脈及び各々の場合におけるXMLプロセサに要求する振舞いを要約する。一番左の列のラベルは,認識の文脈を示す。

内容における参照
要素の開始タグ及び終了タグの間の任意の場所での参照。非終端記号contentに対応する。
属性値における参照
開始タグの属性の値,又は属性宣言におけるデフォルト値のいずれかでの参照。非終端記号AttValueに対応する。
属性値として出現
参照ではなく,Nameとして出現。ENTITY型として宣言した属性の値,又はENTITIES型として宣言した属性の値におけるスペースで区切るトークンの一つとして出現する。
実体値における参照
実体の宣言における,パラメタ又は内部実体のリテラル実体値内の参照。非終端記号EntityValueに対応する。
DTDにおける参照
DTDの内部サブセット又は外部サブセットでの参照。ただし,EntityValue又はAttValueの外側とする。
実体の型 文字
パラメタ 内部 一般 外部 解析対象実体 一般 解析対象外実体
内容での 参照 認識 しない 取込み 検証のために取込み 禁止 取込み
属性値での 参照 認識 しない 取込み 禁止 禁止 取込み
属性値として 出現 認識 しない 禁止 禁止 通知 認識 しない
実体値での 参照 取込み 処理しない 処理しない 禁止 取込み
DTDでの 参照 PEとして 取込み 禁止 禁止 禁止 禁止

4.4.1 “認識しない”

DTDの外では,%文字は,いかなる特定の意味も,もたない。したがって,DTDではパラメタ実体参照として認識するものであっても,content内ではマーク付けとしては認識しない。同様に,適切に宣言した属性の値の中に現れる場合を除き,解析対象外実体の名前は,認識しない。

4.4.2 “取込み”

実体は,その置換テキストを取り出し,処理すると,参照自体の代わりに,参照があった位置で,文書の一部として含まれるかのように取り込まれる。置換テキストは,文字データ及び(パラメタ実体を除く。)マーク付けのいずれを含んでもよく,これらは,通常の方法で認識されなければならない。ただし,マーク付けの区切り子を別扱いするために用いる実体(amp, lt, gt, apos, quot)の置換テキストは,常にデータとして扱う(文字列"AT&amp;T;"は,"AT&T;"に展開され,残されたアンパサンドは,実体参照の区切り子としては認識しない。)。文字参照は,示した文字を参照自体の代わりに処理するとき,取り込まれる

4.4.3 “検証のために取込み”

文書の妥当性を検証するには,XMLプロセサが解析対象実体への参照を認識したとき,その置換テキストを取り込まなければならない。実体が外部実体であって,XML文書の妥当性を検証しなければ,実体の置換テキストを取り込んでもよいが,そうしなくともよい。

この取決めは,SGML及びXMLの実体の機構が提供する自動取込み機能が,文書作成時のモジュール化を主な目的として設計されており,その他のアプリケーション(特に,文書のブラウズ)には,必ずしも適切ではない,という認識による。例えば,ブラウザは外部解析対象実体への参照を見つけると,その実体が存在するという表示だけを行い,表示を要求されたときにだけ,内容を取り出すかもしれない。

4.4.4 “禁止”

次は禁止されており,致命的エラーとする。

4.4.5 “通知”

解析対象外実体の名前が,ENTITY又はENTITIESの属性の値においてトークンとして現れたとき,プロセサは,アプリケーションに対して,関連付けられた記法名,記法に対するシステム識別子及び(存在すれば)公開識別子を通知しなければならない。

4.4.6 “処理しない”

一般実体参照が,実体宣言におけるEntityValue内に現れるとき,それは無視され,そのまま残る。

4.4.7 “PEとして取込み”

外部解析対象実体の場合と同様に,パラメタ実体は,妥当性を検証するときだけ取り込まれる必要がある。パラメタ実体参照をDTD内に認識して取り込むとき,その置換テキストは,その前後に一つのスペース文字(#x20)の付加によって引き伸ばされる。この意図は,パラメタ実体の置換テキストが,DTD内のいくつかの文法的トークンを完全に含むと,制約することにある。

4.5 内部実体置換テキストの構築

内部実体の取扱いの規定で,実体値を二つの形式に区別することは役に立つ。リテラル実体値は,実体宣言内に実際に存在する,引用符で囲む文字列とする。これは,非終端記号EntityValueにマッチする。置換テキストは,文字参照及びパラメタ実体参照の置換え後における,実体の内容とする。

内部実体宣言内で与えるリテラル実体値(EntityValue)は,文字参照,パラメタ実体参照及び一般実体参照を含んでよい。これらの参照は,リテラル実体値内に完全に含まれていなければならない。展開する実際の置換テキスト(先に示したもの)は,参照するパラメタ実体の置換テキストを含まなければならず,リテラル実体値内での文字参照の代わりに参照した文字を含まなければならない。しかし,一般実体参照は,そのまま残し, 展開してはならない。 例えば,次の宣言を与えたとする。

<!ENTITY % pub    "&#xc9;ditions Gallimard" >
<!ENTITY   rights "All rights reserved" >
<!ENTITY   book   "La Peste: Albert Camus, 
&#xA9; 1947 %pub;. &rights;" >

実体の置換テキスト"book"は,次のとおりとなる。

La Peste: Albert Camus, 
nbsp;1947 符itions Gallimard. &rights;

参照"&book;"が,文書の内容又は属性値内に出現していれば,一般実体参照"&rights;"は,展開されている。

これらの単純な規則は,複合相互作用をもつ。 難しい例についての詳細は,実体参照の展開の付録を参照のこと。

4.6 定義済み実体

実体参照及び文字参照のいずれも,不等号(小なり),アンバサンド及び他の区切り子を別扱いするために使用できる。いくつかの一般実体(amp, lt, gt, apos, quot)を,この目的のために指定する。数値による文字参照も,同様の目的のために使用できる。文字参照は,認識されると直ちに展開され,文字データとして扱われるので,数値による文字参照"&#60;"及び"&#38;"は,文字データ内に出現する<及び&を別扱いするために使用できる。

すべてのXMLプロセサは,宣言されているかどうかに関係なく,これらの実体を認識しなくてはならない。相互運用性のため,妥当なXML文書は,これらの実体を使用する前に,他の実体と同様に,宣言することが望ましい。実体を宣言する場合は,置換テキストを別扱いする一文字とする内部実体として,次のとおりに宣言しなければならない。

<!ENTITY lt     "&#38;#60;"> 
<!ENTITY gt     "&#62;"> 
<!ENTITY amp    "&#38;#38;"> 
<!ENTITY apos   "&#39;"> 
<!ENTITY quot   "&#34;"> 

"lt"及び"amp"宣言内の"<"及び"&"文字は,実体の置換テキストが,整形式となるように二重に別扱いされることに注意。

4.7 記法宣言

記法は,解析対象外実体の形式を特定する名前か,又は処理命令の対象とするアプリケーションを特定する名前とする。

記法宣言は,記法の名前及び外部識別子を提供する。この名前は,実体及び属性リスト宣言並びに属性指定に用いる。外部識別子は,与えられた記法のデータを処理できるヘルパアプリケーションを,XMLプロセサ又はクライアントアプリケーションが探すために,利用できる。

記法宣言
[83] NotationDecl ::= '<!NOTATION' S Name S (ExternalID | PublicID) S? '>'
[84] PublicID ::= 'PUBLIC' S PubidLiteral

宣言し,属性値,属性定義又は実体宣言で参照するすべての記法について,XMLプロセサは,記法の名前及び外部識別子をアプリケーションに提供しなければならない。さらに,外部識別子を,システム識別子,ファイル名又はその他の情報に展開してもよく,これらを用いて,アプリケーションは,その記法のデータを処理するプロセサを起動する。(しかし,XMLプロセサ又はアプリケーションが動作するシステムでは利用できない記法を,XML文書が宣言し参照しても,これは,エラーとはしない。)

4.8 文書実体

文書実体は,実体の形成する木構造のルートであって,XMLプロセサが,処理を開始する地点とする。この標準情報(TR)は,XMLプロセサが,文書実体の存在する場所をどのように見つけるかは,規定しない。他の実体と異なり,文書実体は名前をもたず,いかなる識別もなしにプロセサへの入力ストリームに出現してもよい。

5. 適合性

適合するXMLプロセサは,妥当性を検証するもの及び妥当性を検証しないものの,二つに分類される。

妥当性を検証するシステム及び妥当性を検証しないシステムは,この標準情報(TR)が規定する整形式制約への違反を報告しなければならない。

妥当性を検証するプロセサは,DTD内の宣言によって示された,制約への違反を報告しなければならない。さらに,この標準情報(TR)が規定する妥当性制約への違反を,すべて報告しなければならない。

6. 記法

XMLの形式的な文法は,簡単な拡張Backus-Naur Form(EBNF)記法によって与える。文法の各規則は,次の形式で,記号を一つ定義する。

symbol ::= expression

記号は,正規表現で定義するときは大文字で始め,そうでなければ,小文字で始める。文字列リテラルは,引用符で囲む。

規則の右側の式内では,一つ又は複数の文字からなる文字列とマッチするために,次の式を使用する。

#xN
ここで,Nは16進の整数とする。ISO/IEC 10646の文字であって,正規形(UCS-4)のコード値を符号なし2進数として解釈したとき,指定した値と等しいものとマッチする。#xN形式の先頭にゼロがいくつか現れるかは,意味をもたない。コード値における先頭のゼロの数は,文字の符号化によって決定されるので,XMLにとっては意味がない。
[a-zA-Z], [#xN-#xN]
指定した範囲の値(両端の値を含む。)をもつ任意の文字とマッチする。
[^a-z], [^#xN-#xN]
指定した範囲の値をもつ任意の文字とマッチする。
[^abc], [^#xN#xN#xN]
指定した文字以外の値をもつ任意の文字とマッチする。
"string"
二重引用符で囲む文字列リテラルとマッチしている文字列リテラルとマッチする。
'string'
一重引用符で囲む文字列リテラルとマッチしている文字列リテラルとマッチする。
これらの記号は,次の形式の組合せで使用する。ここで,A及びBは,単純な式とする。
(expression)
expressionは,一つのまとまりとして扱い,ここに示す組合せで使ってもよい。
A?
A又は何もなしとマッチする(オプションのA)。
A B
Aの次にBが出現するものとマッチする。
A | B
A又はB,ただし,両方ではない,とマッチする。
A - B
Aとマッチするが,Bとはマッチしない,任意の文字列とマッチする。
A+
Aの1回以上の繰返しとマッチする。
A*
Aの0回以上の繰返しとマッチする。
生成規則内で使用する他の記法を,次に示す。
/* ... */
コメント。
[ 整形式制約: ... ]
整形式制約。生成規則に付与した,整形式の文書に関する制約を,名前によって特定する。
[ 妥当性制約: ... ]
妥当性制約。生成規則に付与した,妥当な文書に関する制約を,名前によって特定する。