この規格は, 2000年6月に2nd EditionとしてWorld Wide Web Consortium(W3C)から公表された勧告Extensible Markup Language (XML)1.0を翻訳し,技術的内容を変更することなく作成した日本工業規格である。
なお,この規格で(点線の)下線を施してある箇所は,原勧告に編集上の変更をしている事項である。
拡張可能なマーク付け言語XML(Extensible Markup Language)は,XML文書というデータオブジェクトのクラスを規定し,XML文書を処理するプログラムの動作の一部を規定する。XMLは,SGML(Standard Generalized Markup Language)[JIS X 4151:1992]の制限したサブセットとする。XML文書は,必ずSGML規格に適合する。
XML文書は実体という記憶単位から成り,実体は構文解析されるデータ又は構文解析されないデータから成る。構文解析されるデータは,文字から成り,その一部は文字データを構成し,一部はマーク付けを構成する。マーク付けは,文書の記憶レイアウト及び論理構造を記述する符号とする。XMLは,記憶レイアウト及び論理構造についての制約条件を記述する機構を提供する。
XMLプロセサというソフトウェアモジュールは,XML文書を読み込み,その内容及び構造へのアクセスを提供するために用いる。 XMLプロセサは,他のモジュールのために動作することを前提としており,そのモジュールを応用プログラムという。この規格は,XMLプロセサに要求される振る舞いを規定する。つまり,XMLデータの読込み方法を規定し,応用プログラムに提供する情報を規定する。
1996年にWorld Wide Web Consortium(W3C)の中に設立されたXML作業グループ(以前は,SGML編集レビュー委員会と呼ばれた。)がXMLを開発した。この作業グループの議長を,Sun MicrosystemsのJon Bosakが務めた。W3Cが組織し,以前はSGML作業グループと呼ばれたXML SIG(Special Interest Group)も,XMLの制定に活発に参画した。XML作業グループのメンバを附属書Gに示す。Dan Connollyは,作業グループとW3Cとの調整役を務めた。
XMLの設計目標を次に示す。
a) |
XMLは,インタネット上でそのまま使用できる。 |
b) |
XMLは,広範囲の応用プログラムを支援する。 |
c) |
XMLは,SGMLと互換性をもつ。 |
d) |
XML文書を処理するプログラムは容易に書ける。 |
e) |
XMLでは,任意選択の機能はできるだけ少なくし,理想的には一つも存在しない。 |
f) |
XML文書は,人間にとって読みやすく,十分に理解しやすいことが望ましい。 |
g) |
XMLの設計は,すみやかに行うことが望ましい。 |
h) |
XMLの設計は,厳密で,しかも簡潔なものとする。 |
i) |
XML文書は,容易に作成できる。 |
j) |
XMLでは,マーク付けの数を減らすことは重要ではない。 |
XML第1.0版を理解し,それを処理する計算機プログラムを書くために十分な情報は,この規格,関連する規格など(文字についてはUnicode及びJIS X 0221-1,言語識別タグについてはIETF RFC 3066,言語コードについてはJIS X 0304,並びに国名コードについてはISO 3166。)によってすべて示す。
この版のXMLの原規定は,テキスト及び法律上の注意を一切改変しない限り,自由に配布してもよい.
XML文書を規定するために使用する用語は,この規格内で定義する。次に示す語句は,それらの用語を定義するため,及びXMLプロセサの動きを規定するために使用する。
この規格が定める規則に対する違反。結果は定義しない。適合するソフトウェアは,誤りを検出して報告してもよく,誤りから回復してもよい。
適合するXMLプロセサが検出し,応用プログラムに報告しなければならない誤り。プロセサは,致命的な誤りを発見したあとも,それ以降の誤りを探すためにデータ処理を続行し,見つかった誤りを応用プログラムに報告してもよい。誤り訂正をサポートするために,プロセサは,処理していないデータ(文字データ及びマーク付けの混在したもの。)を文書から取り出し,応用プログラムに渡してもよい。しかし,プロセサは,致命的な誤りを1度でも検出したならば,通常の処理を続行してはならない。つまり,プロセサは,文字データと文書の論理構造についての情報とを,通常の方法で応用プログラムに渡し続けてはならない。
適合するソフトウエアは,記述されたとおりに振る舞ってもよい(may),又は振る舞わなくてはならない(must)(文中の助動詞による。)。そのとおりに振る舞う場合は,記述された振る舞いを選択又は拒否する手段を利用者に提供しなければならない。
すべての妥当な XML文書に適用する規則。妥当性制約への違反は,誤りとする。利用者の任意選択によっては,検証を行うXMLプロセサは,この誤りを報告しなければならない。
(文字列又は名前がマッチする)比較する二つの文字列又は名前は,同一でなければならない。JIS X 0221-1において,複数の表現が可能な文字[例えば,合成形式及び基底文字+ダイアクリティカルマーク(ダイアクリティカルマーク)形式]は,どちらの文字列も同じ表現のときに限り,マッチする。比較のとき ,大文字と小文字との区別をする。(文字列と文法中の規則とがマッチする)ある生成規則から生成する言語に,ある文字列が属するとき,この文字列は,この生成規則にマッチするという。(内容と内容モデルとがマッチする)ある要素が,制約[妥当性制約: 要素の妥当性]に示す意味で宣言に適合するとき,この要素は,マッチするという。
適合する文書又はXMLプロセサは,記述されたとおりに動作することが要求される。そうでなければ,誤りとする。
この規格で定義する意味で,整形式のデータオブジェクトをXML文書という。整形式のXML文書が,ある制約条件を満足すれば,妥当なXML文書という。
XML文書は,論理構造及び物理構造をもつ。物理的には,文書は,実体という単位からなる。実体が他の実体を参照すれば,参照された実体も文書の一部になる。文書は,“ルート”すなわち文書実体から始まる。論理的には,文書は,宣言・要素・コメント・文字参照・処理命令を含み,これらすべては,文書内で明示的なマーク付けによって示す。論理構造及び物理構造は,4.3.2 (整形式の解析対象実体)に示すとおりに,厳密に入れ子になっていなければならない。
あるテキストオブジェクトが,次の条件を満たすとき,そのテキストオブジェクトを整形式のXML文書と呼ぶ。
a) |
全体として,documentというラベルをもつ生成規則にマッチする。 |
b) |
この規格で定義するすべての整形式制約に従う。 |
c) |
[1] | document |
::= | prolog
element
Misc* |
生成規則documentにマッチするとは,次を意味する。
a) |
一つ以上の要素を含む。 |
b) |
ルート又は文書要素という要素が一つだけ存在し,これは,他の要素の内容に含まれない。 これ以外のすべての要素は,その開始タグが他の要素の内容に含まれれば,対応する終了タグも同じ要素の内容に含まれる。つまり,要素は,開始タグ及び終了タグによって区切られ,入れ子構造をなす。 |
これらの結果として,文書内のどの非ルート要素C
に対しても,ある要素P
が存在し,C
は,P
の内容に含まれるが,P
の内容に含まれる他の要素に含まれることはない。このとき,P
をC
の親といい,C
をP
の子という。
解析対象実体は,テキスト(文字の並びであって,マーク付け又は文字データを表す。)を含む。文字は,テキストの最小単位であって,[JIS X 0221-1:2001] に規定されている。使用できる文字は,タブ・復帰・改行・(Unicode及びJIS X 0221-1に規定する)文字とする。 附属書A.1 (規定の参考文献)で引用されるこれらの規格の版は,この規格の原勧告が作成された時点で最新のものとする。補遺又は新版によって,これらの規格には新しい文字が追加されることがある。したがって,XMLプロセサは,Charで指定した範囲のすべての文字を受け付けなければならない。[Unicode]の6.8節([Unicode3]の3.6節のD21も参照すること。)で定義される互換用文字は使用を避けることが望ましい。
[2] | Char |
::= | #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] |
[#x10000-#x10FFFF] |
/* 任意のUnicode文字。ただし,S領域,FFFE及びFFFFは除く。 */ |
文字符号位置をビットパタンに符号化する機構は,実体ごとに違ってもよい。すべてのXMLプロセサは,Unicode 3.1 のUTF-8符号化及びUTF-16符号化を受け付けなければならない。二つのどちらが用いられているかを明示するため又は他の符号化を利用するための機構は,4.3.3 (実体における文字符号化)に記述する。
この章では,文法内で広く使用する幾つかの記号を定義する。
S (空白)は,一つ以上のスペース文字(#x20),復帰,改行又はタブから成る。
[3] | S |
::= | (#x20 | #x9 | #xD | #xA)+ |
便宜上,文字を,字(letter)・数字・他の文字に分類する。一つの字(letter)は,アルファベット的若しくは音節文字である基底文字又は漢字のような文字とする。各クラスにおける実際の文字についての完全な定義は,附属書Bに示す。
Nameは,字(letter)又は幾つかの区切り文字の一つで始まり,その後に字(letter),数字,ハイフン,下線,コロン又はピリオドが続く。これらの文字を名前文字という。文字列"xml
"で始まる名前,又は正規表現(('X'|'x')
('M'|'m') ('L'|'l'))
にマッチする任意の文字列で始まる名前は,この規格の現在の版又は将来の版での標準化のために予約する。
備考 XML名前空間勧告[TR X 0023]は,コロン文字を含む名前に意味を与えている。そのため作者は,名前空間の用途以外で名前にコロンを使用しないことが望ましい。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)* |
備考 生成規則Names及び Nmtokensは,トークン化された属性値が正規化されたあとの妥当性を定義するために使用する(3.3.1 (属性の型)を参照。)。
リテラルデータは,引用符で囲まれた文字列とし,その列を区切る引用符は含まない。リテラルは,内部実体の内容(EntityValue),属性値(AttValue),外部識別子(SystemLiteral)の指定に使用する。SystemLiteralはマーク付けの走査を行なわずに解析できることに注意。
[9] | EntityValue |
::= | '"' ([^%&"] | PEReference
| Reference)*
'"' |
| "'" ([^%&'] | PEReference
| Reference)*
"'" | |||
[10] | AttValue |
::= | '"' ([^<&"] | Reference)*
'"' |
| "'" ([^<&'] | Reference)*
"'" | |||
[11] | SystemLiteral |
::= | ('"' [^"]* '"') | ("'" [^']* "'") |
[12] | PubidLiteral |
::= | '"' PubidChar*
'"' | "'" (PubidChar
- "'")* "'" |
[13] | PubidChar |
::= | #x20 | #xD | #xA | [a-zA-Z0-9]
| [-'()+,./:=?;!*#@$_%] |
備考
生成規則EntityValueは,リテラルに単独の<
を明示的に指定する実体定義(例えば
<!ENTITY mylt
"<">
)を認めている。この実体を参照すると整形式誤りが生じるため,この実体定義を避けることを強く勧める。
テキストは,文字データ及びマーク付けから成る。マーク付けは,開始タグ,終了タグ,空要素タグ,実体参照,文字参照, コメント, CDATAセクション の区切り子,文書型宣言, 処理命令及びXML宣言, テキスト宣言, 文書の最上位レベルにあるすべての空白文字(つまり文書要素の外側で他のマーク付けの内側でないもの)の形をとる。
マーク付けではないすべてのテキストは,文書の文字データを構成する。
アンパサンド(&)及び不等号(より小) (<)は,マーク付けの区切り子として使用する場合,又はコメント,処理命令若しくはCDATAセクション
内で使用する場合にだけ,そのままの形で出現してよい。 これらの文字が他の部分で必要な場合,番号による文字参照又は文字列"&
"及び文字列"<
"を使用して別扱いしなければならない。不等号(より大)
(>)は,文字列">
"を使用して表現してもよい。内容の中で列"]]>
"を使用するときは,それが,CDATAセクションの終了をマーク付けしない限り,互換性のため,">
"又は文字参照を使用して別扱いしなければならない。
要素の内容では,いかなるマーク付けの開始区切り子も含まない任意の文字列が,文字データを構成する。CDATAセクションでは,CDATAセクションの終了区切り子"]]>
"を含まない任意の文字列が,文字データを構成する。
属性値が一重引用符及び二重引用符を含むためには,アポストロフィ又は一重引用符(')は,"'
"として表現し,二重引用符(")は,""
"として表現する。
[14] | CharData |
::= | [^<&]* - ([^<&]* ']]>'
[^<&]*) |
コメント は,他のマーク付けの外ならば,文書のどこに現れてもよい。さらに,文書型宣言の中で,文法が許す場所に現れてもよい。コメントは,文書の文字データの一部ではない。XMLプロセサは,応用プログラムがコメントのテキストを取り出すことを可能としてもよいが,そうしなくともよい。
互換性のためには,文字列
"--
"(二連ハイフン)は,コメント内で現れてはならない。パラメタ実体参照は,コメントの内部では認識されない。
[15] | Comment |
::= | '<!--' ((Char
- '-') | ('-' (Char
- '-')))* '-->' |
コメントの例を次に示す。
<!-- declarations for <head> & <body> -->
この文法は,--->
で終わるコメントを許さないことに注意すること。次に,整形式でない例を示す。
<!-- B+, B, or B--->
処理命令(PI)によって,応用プログラムのための命令を文書に入れることができる。
処理命令
[16] | PI |
::= | '<?' PITarget
(S
(Char*
- (Char*
'?>' Char*)))?
'?>' |
[17] | PITarget |
::= | Name
- (('X' | 'x') ('M' | 'm') ('L' |
'l')) |
XML
","xml
"などは,この規格の現在の版又は将来の版の標準化のために予約する。XMLの記法機構を,PIのターゲットを宣言するために使用してもよい。パラメタ実体参照は,処理命令の内部では認識されない。
[18] | CDSect |
::= | CDStart
CData
CDEnd |
[19] | CDStart |
::= | '<![CDATA[' |
[20] | CData |
::= | (Char*
- (Char*
']]>' Char*))
|
[21] | CDEnd |
::= | ']]>' |
CDATAセクション内では,文字列CDEndだけをマーク付けとして認識するので,不等号(より小)及びアンパサンドは,そのままの形で出現してよい。"<
"及び"&
"を使用して別扱いする必要はない(別扱いできない。)。CDATAセクションは入れ子にはできない。
"<greeting>
"及び"</greeting>
"を,マーク付けではなく,文字データとして認識するためのCDATAセクションの例を次に示す。
<![CDATA[<greeting>Hello, world!</greeting>]]>
XML文書は,使用するXMLの版を指定するXML宣言で始めることが望ましい。 例えば,次に示す完全なXML文書は,整形式であるが 妥当ではない。
<?xml version="1.0"?> <greeting>Hello, world!</greeting>
同じことが次の文書にもあてはまる。
<greeting>Hello, world!</greeting>
XML文書内のマーク付けの機能は,記憶構造及び論理構造を記述すること,並びに属性及び属性値の対を論理構造に関連づけることにある。XMLは,論理構造についての制約条件を定義するため,及びあらかじめ定義された記憶単位を使用するための機構として文書型宣言を提供する。 妥当なXML文書とは,文書型宣言をもち,その文書型宣言に示す制約条件を満たすXML文書とする。
文書型宣言は,文書の最初の要素の前に現れなければならない。
[22] | prolog |
::= | XMLDecl?
Misc*
(doctypedecl
Misc*)? |
[23] | XMLDecl |
::= | '<?xml' VersionInfo
EncodingDecl?
SDDecl?
S?
'?>' |
[24] | VersionInfo |
::= | S
'version' Eq
("'" VersionNum
"'" | '"' VersionNum
'"') |
[25] | Eq |
::= | S?
'=' S? |
[26] | VersionNum |
::= | ([a-zA-Z0-9_.:] | '-')+ |
[27] | Misc |
::= | Comment
| PI
| S |
XMLの文書型宣言は,ある文書クラスのための文法を記述するマーク付け宣言を含むか,参照する。この文法を,文書型定義又はDTDという。文書型宣言は,マーク付け宣言を含んだ外部サブセット(特別な種類の外部実体)を参照することができ,又は内部サブセットにマーク付け宣言を直接含むこともできる。外部サブセットと内部サブセットの両方を使うこともできる。ある文書のDTDは,両方のサブセットをまとめたものとして構成される。
マーク付け宣言は,要素型宣言, 属性リスト宣言,実体宣言又は記法宣言とする。次に示す整形式制約及び妥当性制約に規定するとおり,これらの宣言は,パラメタ実体内に全体又は一部が含まれてもよい。より詳しい情報は,4. (物理構造)を参照。
[28] | doctypedecl |
::= | '<!DOCTYPE' S
Name
(S
ExternalID)?
S?
('[' intSubset
']' S?)?
'>' |
[妥当性制約: ルート要素型] |
[整形式制約: 外部サブセット] | ||||
[28a] | DeclSep |
::= | PEReference
| S |
[整形式制約: 宣言間のパラメタ実体] |
[28b] | intSubset |
::= | markupdecl
| DeclSep
| |
[29] | markupdecl |
::= | elementdecl
| AttlistDecl
| EntityDecl
| NotationDecl
| PI
| Comment
|
[妥当性制約: 宣言及びパラメタ実体が厳密に入れ子をなすこと] |
[整形式制約: 内部サブセット内のパラメタ実体] |
外部サブセットを参照せず,内部サブセットを含まないdoctypedeclをもつ整形式文書を作成できることに注意すること。
マーク付け宣言は,その全体又は一部を,パラメタ実体の置換テキストで構成してもよい。各々の非終端記号 (elementdecl,AttlistDeclなど)のための生成規則は,この規格の後半にあり,すべてのパラメタ実体を取り込んだ後の宣言について記述する。
パラメタ実体参照は,DTD(内部及び外部サブセット並びに外部パラメタ実体)のどの場所でも認識される。ただし,リテラル,処理命令,コメント及び無視される条件セクション(3.4 (条件付きセクション)を参照。)を除く。パラメタ実体は,実体値リテラルでも同様に認識される。内部サブセットで使用されるパラメタ実体は,次に示す制限を受ける。
パラメタ実体の置換テキストは,マーク付け宣言内において,厳密に入れ子になっていなければならない。つまり,マーク付け宣言(markupdecl)の最初又は最後の文字が,パラメタ実体参照の指し示す置換テキストに含まれれば,両方とも同じ置換テキストに含まれなければならない。
DTDの内部サブセットでは,パラメタ実体参照は,マーク付け宣言が出現可能な場所だけに出現できる。マーク付け宣言の一部としては出現できない。この制約は,外部パラメタ実体又は外部サブセットでの参照には適用しない。
外部サブセットがある場合,その外部サブセットは,生成規則 extSubsetにマッチしなければならない。
DeclSepでのパラメタ実体参照の置換テキストは,生成規則extSubsetDeclにマッチしなければならない。
内部サブセットのときと同様に,外部サブセットと,DeclSepにおいて参照する任意の外部パラメタ実体とは,非終端記号markupdeclによって許される型の完全なマーク付け宣言を幾つか並べたものでなければならない。マーク付け宣言の間には,空白又はパラメタ実体参照を置いてもよい。外部サブセット又はこれらの外部パラメタ実体の内容の一部は,条件付きセクションを使用して無視してもよいが,内部サブセットではこれは許されない。
[30] | extSubset |
::= | TextDecl?
extSubsetDecl | |
[31] | extSubsetDecl |
::= | ( markupdecl
| conditionalSect
| DeclSep)* |
外部サブセット及び外部パラメタ実体の中では,パラメタ実体参照がマーク付け宣言の間だけでなく,マーク付け宣言の中でも認められる。この点でも,外部サブセット及び外部パラメタ実体は,内部サブセットと異なる。
文書型宣言付きの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>
外部サブセット及び内部サブセットの両方を使用するときは,内部サブセットが外部サブセットより先に出現したと見なす。これは,内部サブセットの実体及び属性リスト宣言が,外部サブセットの実体及び属性リスト宣言に優先するという効果をもたらす。
XMLプロセサは,応用プログラムに文書の内容を渡すが,マーク付け宣言は,この内容に影響を与えることがある。例えば,属性のデフォルト値及び実体宣言は影響を与える。非依存文書宣言は,XML宣言の一部分として出現することができ,影響を与えるマーク付け宣言が文書実体の外部又はパラメタ実体の中に出現するかどうかを示す。外部マーク付け宣言は外部サブセット又はパラメタ実体の中に出現するマーク付け宣言として定義される(パラメタ実体は,外部でも内部でもよい。妥当性を検証しないプロセサが内部パラメタ実体を読むことを義務付けないために,内部パラメタ実体も含める。)。
[32] | SDDecl |
::= | S
'standalone' Eq
(("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) |
[妥当性制約: 非依存文書宣言] |
非依存文書宣言では, 値"yes"は,XMLプロセサから応用プログラムへと渡される情報に影響する外部マーク付け宣言が存在しないことを意味する。値"no"は,影響する外部マーク付け宣言が存在するか,又は存在する可能性があることを意味する。非依存文書宣言は,外部宣言が存在するかどうかだけを示すことに注意すること。外部実体への参照が文書内に存在していても,その実体が内部で宣言されているときは,文書の非依存の値には影響を与えない。
外部マーク付け宣言が存在しなければ,非依存文書宣言は意味をもたない。外部マーク付け宣言は存在するが,非依存文書宣言が存在しない場合は,"no"の値が設定されているものとする。
XML文書で standalone="no"
が設定されているものは,あるアルゴリズムでstandalone="yes"
の文書に変換できる。変換後の文書の方がネットワークによる配信には望ましい。
非依存文書宣言は,何らかの外部マーク付け宣言が次のいずれかを宣言しているときは,値"no"を取らなければならない。
a) |
デフォルト値付きの属性であって,この属性が適用される要素が,属性値を 指定せずに文書内に現れるもの。 |
b) |
|
c) |
トークン化された型をもつ属性であって,文書中で出現するときの属性値は,この値から正規化が生成する値と,宣言がないとしたときに正規化が生成する値とが異なるもの。 |
d) |
要素内容をもつ要素型であって,空白がその要素型のいずれかのインスタンス内に直接現れるもの。 |
非依存文書宣言付きのXML宣言の例を,次に示す。
<?xml version="1.0" standalone='yes'?>
XML文書を編集するときは,マーク付けを目立たせ読みやすくするために,“空白”(スペース,タブ及び空白行)を使うと便利なことが多い。これらの空白は,配布する版の文書の一部に含めることを普通は意図していない。しかし,“意味のある”空白であって,配布する版に保持されなければならないものも多い。例えば,詩及びソースコードにおける空白がこれにあたる。
XMLプロセサは,文書内のマーク付け以外のすべての文字を,変更せずにそのまま応用プログラムに渡さなければならない。妥当性を検証するXMLプロセサは,これらの文字の中でどの文字が要素内容に出現する空白を構成するかを応用プログラム側に伝えなければならない。
"xml:space
"という特別な属性を要素に加えることによって,応用プログラムはこの要素の中の空白を保存することが望ましいという意図を示してもよい。妥当な文書では,この属性を使用する場合は,他の属性と同じように宣言しなければならない。宣言するときは,取り得る値を"default","preserve"のいずれか又は両方に限る列挙型でなければならない。例を次に示す。
<!ATTLIST poem xml:space (default|preserve) 'preserve'> <!ATTLIST pre xml:space (preserve) #FIXED 'preserve'>
値"default"は,応用プログラムのデフォルトの空白処理モードがその要素に適用できることを意味する。値"preserve"は,応用プログラムがすべての空白を保存することを意味する。この宣言の意図は,"xml:space
"属性の別の指定で上書きしない限り,要素の内容に現れるすべての要素に適用すると解釈する。
文書のルート要素については,この属性の値を指定するか,又はこの属性のデフォルト値が宣言されている場合を除いては,応用プログラムによる空白の取扱いについて,いかなる意図も示さないと解釈する。
XMLの解析対象実体は,通常コンピュータのファイル内に保存され,編集の便宜のために複数の行に分けることが多い。これらの行は,普通は,復帰(#xD)コード及び改行(#xA)コードの何らかの組合せによって分けられる。
応用プログラムの仕事を簡単にするため, XMLプロセサは,次の処理をした場合と同一の文字を,応用プログラムに渡さなければならない。入力された(文書実体を含む。)外部解析対象実体の中のすべての行末(連続する2文字#xD #xA,及び#xAを後ろにともなわない#xD)を,解析を行う前にXMLプロセサが単一の#xAに変換することによって正規化する処理とする。
文書処理においては,その文書の中身がどんな自然言語又は形式言語で書かれているか明示することが,役に立つことが多い。XML文書内の要素のもつ内容又は属性値において使用する言語を指定するために,xml:lang
という名前の特別な属性を,文書内に挿入してもよい。妥当な文書においてこの属性を使用する場合は,他の属性と同様に宣言しなくてはならない。この属性の値は,言語識別のためのタグ [IETF
RFC 3066],又はIETF標準化トラックの後継規定で定義される言語識別コードとする。
(生成規則33から38は削除された。)
例を次に示す。
<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
属性で上書きされない限り,指定した要素のすべての属性と内容に適用される。
xml:lang
を次に示すとおり,簡単に(デフォルト値を与えずに)宣言してもよい。
xml:lang NMTOKEN #IMPLIED
xml:lang
を次のとおりに宣言することとなる。
<!ATTLIST poem xml:lang NMTOKEN 'fr'> <!ATTLIST gloss xml:lang NMTOKEN 'en'> <!ATTLIST note xml:lang NMTOKEN 'en'>
いかなるXML文書も,一つ以上の要素を含む。要素の境界は,開始タグ及び終了タグによって区切る。要素が空要素のときは,空要素タグで示す。各々の要素は型をもつ。要素型は名前[共通識別子(generic identifier)又はGIと呼ぶことがある。]によって特定される。要素は幾つかの属性をもつことができる。属性は名前及び値をもつ。
[39] | element |
::= | EmptyElemTag | |
| STag
content
ETag |
[整形式制約: 要素型のマッチ] | |||
[妥当性制約: 要素の妥当性] |
この規格は,要素型及び属性の意味,使用方法,又は(構文に関することを除き)名前に制約を与えない。ただし,正規表現(('X'|'x')('M'|'m')('L'|'l'))
にマッチする文字列で始まる名前は,この版又は今後の版のこの規格での標準化のために予約する。
要素の終了タグの名前は,その要素の開始タグにおける要素型とマッチしなければならない。
要素が妥当とは,その要素型とマッチするNameをもつ宣言(elementdeclにマッチするもの)が存在し,さらに次のいずれかの条件を満たす場合とする。
a) |
宣言がEMPTYにマッチし,要素が 内容をもたない(実体参照・コメント・PI・空白も,もたない。)。 |
b) |
宣言がchildrenにマッチし,要素の 子要素の並びが(実体参照を置換テキストで置き換えた後で),内容モデル中の正規表現によって生成される言語に属する。開始タグ及び最初の子要素の間,子要素の間,又は最後の子要素及び終了タグの間に空白・コメント・PI (すなわち,Miscにマッチするもの。)が,あってもよい。空白文字だけを含むCDATAセクション,及び空白に展開される文字参照を置換テキストとしてもつ実体への参照は,非終端記号Sにマッチせず,そのためこれらの位置に出現できないことに注意すること。しかし,空白に展開される文字参照だけから構成されるリテラル値をもつ内部実体への参照は,文字参照の展開により置換テキストが空白になるので,非終端記号Sにマッチする。 |
c) |
宣言がMixedにマッチし,要素の内容は,(実体参照を置換テキストで置き換えた後に)文字データ,空白,PI及び 子要素からなる。子要素の要素型は,内容モデルに出現する名前にマッチする。 |
d) |
宣言がANYにマッチし,(実体参照を置換テキストで置き換えた後に)どの子要素の要素型も宣言されている。 |
空でない任意のXML要素の始まりは,開始タグによってマーク付けする。
開始タグ
[40] | STag |
::= | '<' Name
(S
Attribute)*
S?
'>' |
[整形式制約: 属性指定の一意性] |
[41] | Attribute |
::= | Name
Eq
AttValue |
[妥当性制約: 属性値の型] |
[整形式制約: 外部実体への参照がないこと] | ||||
[整形式制約: 属性値に<を含まないこと] |
'
又は"
の間のテキスト)を属性値という。開始タグ又は空要素タグにおける属性指定の順序には意味がないことに注意すること
属性は宣言されていなければならない。属性値は,その属性に対して宣言した型に属さなければならない(属性の型については,3.3 (属性リスト宣言)を参照。)。
属性値内で直接的又は間接的に参照する実体の置換テキストには,<
を含んではならない。
開始タグの例を次に示す。
<termdef id="dt-dog" term="dog">
開始タグで始まる要素の終わりは,終了タグでマーク付けしなければならない。この終了タグは,対応する開始タグの要素型と同じ名前をもつ。
[42] | ETag |
::= | '</' Name
S?
'>' |
終了タグの例を,次に示す。
</termdef>
要素の開始タグと終了タグとの間のテキストをその要素の内容という。
[43] | content |
::= | CharData?
((element
| Reference
| CDSect
| PI
| Comment)
CharData?)* |
内容をもたない要素は空であるという。空要素は,終了タグを直後にともなう開始タグによって表現されるか,又は空要素タグによって表現される。 空要素タグは,次の特別な形式をとる。
[44] | EmptyElemTag |
::= | '<' Name
(S
Attribute)*
S?
'/>' |
[整形式制約: 属性指定の一意性] |
空要素タグは,内容をもたない任意の要素の表現に利用できる。空要素タグで表現する要素を,キーワードEMPTYを用いて宣言しなくてもよい。 相互運用性のためには,空要素タグは, EMPTYとして宣言された要素に使用すべきであり,またこれ以外の要素に使用すべきではない。
空要素の例を,次に示す。
<IMG align="left" src="http://www.w3.org/Icons/WWW/w3c_home" /> <br></br> <br/>
妥当性を保証するため,要素型宣言及び属性リスト宣言を用いてXML文書の要素の構造に制約を加えることができる。要素型宣言は,要素の 内容についての制約とする。
要素型宣言は,要素の子として出現可能な要素型について,制約を加えることが多い。利用者の任意選択によっては,要素型宣言をもたない要素型が他の要素型宣言によって参照されれば,XMLプロセサは警告を出してもよい。しかし,これは誤りとはしない。
[45] | elementdecl |
::= | '<!ELEMENT' S
Name
S
contentspec
S?
'>' |
[妥当性制約: 要素型宣言の一意性] |
[46] | contentspec |
::= | 'EMPTY' | 'ANY' | Mixed
| children
|
ここで,Nameは宣言されている要素の型を示す。
要素型宣言の例を次に示す。
<!ELEMENT br EMPTY> <!ELEMENT p (#PCDATA|emph)* > <!ELEMENT %name.para; %content.para; > <!ELEMENT container ANY>
ある型の要素が,必ず子要素だけを含み(文字データを含まない。) ,それらの間には空白(非終端記号Sにマッチする文字)だけしか現れないとき,その要素型は,要素内容をもつという。 この場合,内容モデルが制約となる。内容モデルは,子要素の型及び子要素の出現順序を制御する簡単な文法とする。この文法は,内容素子(cp)から成る。内容素子は,名前,内容素子の選択リスト又は内容素子の列リストから構成される。
[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回(?
)出現可能なことを規定する。この演算子がない場合は要素又は内容素子が正確に1度だけ現われなくてはならないことを意味する。
ここで示す構文及び意味は,この規格における生成規則で用いるものと同一とする。
要素の内容が内容モデルにマッチするのは,列,選択及び繰返し演算子に従って,内容の中の要素と内容モデル内の要素型とをマッチさせながら,内容モデル内の一つのパスをたどれるときに限る。互換性のため,要素が,内容モデルにおける要素型の複数の出現位置とマッチする内容モデルは,誤りとする。詳細な規定については,誤りとする。詳細な規定については,附属書Eを参照。
妥当性制約: グループ及びパラメタ実体が厳密な入れ子をなしている
パラメタ実体の置換テキストは,括弧で囲まれたグループによって,厳密な入れ子を構成しなければならない。つまり,choice,seq又はMixedに含まれる左小括弧又は右小括弧のいずれか一方が パラメタ実体の置換テキストに含れれば,他方も同じ置換テキストに含まれなければならない。
相互運用性のためには,choice,seq又はMixedの中にパラメタ実体が現れた場合,その置換テキストは少なくとも一つの空でない文字を含むことが望ましく,置換テキストの最初及び最後の空でない文字は接続子(
|
又は,
)でないことが望ましい。
要素内容モデルの幾つかの例を次に示す。
<!ELEMENT spec (front, body, back?)> <!ELEMENT div1 (head, (p | list | note)*, div2*)> <!ELEMENT dictionary-body (%div.mix; | %dict.mix;)*>
ある要素型の要素が文字データを含むことができるとき,その要素型は,混合内容をもつという(文字データに子要素が混在しても構わない。)。 この場合,子要素の型についての制約が存在してもよいが,子要素の順序又は出現回数についての制約は存在しない。
[51] | Mixed |
::= | '(' S?
'#PCDATA' (S?
'|' S?
Name)*
S?
')*' | |
| '(' S?
'#PCDATA' S?
')' |
[妥当性制約: グループ及びパラメタ実体が厳密な入れ子をなしている] | |||
[妥当性制約: 要素型の重複の禁止] |
ここで,Nameは子として出現してもよい要素の型を示す。キーワード #PCDATA は,歴史的には"解析対象文字データ(parsed character data)"に由来する。
混合内容宣言の例を次に示す。
<!ELEMENT p (#PCDATA|a|ul|b|i|em)*> <!ELEMENT p (#PCDATA | %font; | %phrase; | %special; | %form;)* > <!ELEMENT b (#PCDATA)>
属性は,名前及び値の対を要素に関連付けるために用いる。属性指定は,開始タグ又は空要素タグ内でだけ可能とする。したがって,属性指定を認識するための生成規則は,3.1 (開始タグ,終了タグ及び空要素タグ)に示されている。属性リスト宣言は,次の目的で用いる。
ある要素型に適用する属性の集合を規定する。
属性への型制約を設定する。
属性のデフォルト値を規定する。
属性リスト宣言は,ある要素型と関連付けられた各属性に対し,名前,データ型及び(存在すれば)デフォルト値を規定する。
[52] | AttlistDecl |
::= | '<!ATTLIST' S
Name
AttDef*
S?
'>' |
[53] | AttDef |
::= | S
Name
S
AttType
S
DefaultDecl |
AttlistDecl規則に含まれるNameは,要素型の名前とする。利用者の任意選択によっては,宣言していない要素型に対して属性を宣言したならば,XMLプロセサは,警告を出してもよい。しかし,これは誤りとはしない。 AttDef規則におけるNameは,属性の名前とする。
ある要素型に対して,複数のAttlistDeclがある場合,これらすべての内容を繋ぎ合わせる。ある要素型の同じ属性に,複数の定義がある場合には,最初の宣言を有効とし,他の宣言は無視する。相互運用性のためには,DTDの作成者は,ある要素型には高々一つの属性リスト宣言しか与えない,ある属性名には高々一つの属性定義しか与えない,及びすべての属性リスト宣言には少なくとも一つの属性定義を与える,という選択をしてもよい。相互運用性のためには,XMLプロセサは,利用者の任意選択によっては,ある要素型に複数の属性リスト宣言を与えたり,ある属性に複数の属性定義を与えたりしたときに,警告を出してもよい。しかし,これは,誤りとはしない。
XMLの属性の型は,文字列型・トークン化型・列挙型の3種類とする。文字列型は,値として任意のリテラル文字列をとる。トークン化型は,字句及び意味に関して,次に示す様々な制約をもつ。文法中で書かれている妥当性制約は,3.3 (属性リスト宣言)で記述されるとおり属性値が正規化された後で適用される。
[54] | AttType |
::= | StringType
| TokenizedType
| EnumeratedType
| |
[55] | StringType |
::= | 'CDATA' | |
[56] | TokenizedType |
::= | 'ID' |
[妥当性制約: ID] |
[妥当性制約: 一つの要素ごとに一つのID] | ||||
[妥当性制約: ID属性のデフォルト] | ||||
| 'IDREF' |
[妥当性制約: IDREF] | |||
| 'IDREFS' |
[妥当性制約: IDREF] | |||
| 'ENTITY' |
[妥当性制約: 実体名] | |||
| 'ENTITIES' |
[妥当性制約: 実体名] | |||
| 'NMTOKEN' |
[妥当性制約: 名前トークン] | |||
| 'NMTOKENS' |
[妥当性制約: 名前トークン] |
ID型の値は,生成規則Nameにマッチしなければならない。一つのXML文書内では,一つの名前が,この型の値として複数回現れてはならない。つまり,IDの値は,要素を一意に特定しなければならない。
IDREF型の値は,生成規則Nameにマッチしなければならない。IDREFS型の値は,Namesにマッチしなければならない。各々のNameは,XML文書内に存在する要素のID属性の値とマッチしなければならない。つまり,IDREFの値は,あるID属性の値とマッチしなければならない。
ENTITY型の値は,生成規則Nameにマッチしなければならない。ENTITIES型の値は,Namesにマッチしなければならない。各々のNameは,DTDで宣言する解析対象外実体とマッチしなければならない。
列挙型の属性は,宣言した幾つかの値の一つを取ることができる。列挙型には,2種類ある。
[57] | EnumeratedType |
::= | NotationType
| Enumeration
| |
[58] | NotationType |
::= | 'NOTATION' S
'(' S?
Name
(S?
'|' S?
Name)*
S?
')' |
[妥当性制約: 記法属性] |
[妥当性制約: 一つの要素型に一つの記法] | ||||
[妥当性制約: 空要素に記法なし] | ||||
[妥当性制約: トークンの重複なし] | ||||
[59] | Enumeration |
::= | '(' S?
Nmtoken
(S?
'|' S?
Nmtoken)*
S?
')' |
[妥当性制約: 列挙] |
[妥当性制約: トークンの重複なし] |
NOTATION属性は,その属性が付与されている要素を解釈するのに使用する記法を特定する。記法は, DTD内で宣言され,システム識別子及び/又は公開識別子に関連付けられる。
この型の値は,宣言に含まれる幾つかの記法の名前の一つとマッチしなければならない。つまり,宣言に含まれる記法名は,すべて宣言されていなければならない。
相互運用性のためには ,NOTATION型の属性をEMPTYと宣言された要素に対して宣言してはならない。
単一のNotationType属性宣言における記法名は,すべて異なるものとする。同様に,単一のEnumeration属性宣言におけるすべての Nmtokenは,すべて異なるものとする。
この型の値は,宣言に含まれる幾つかのNmtokenトークンの一つとマッチしなければならない。
相互運用性のためには,同じNmtokenは,一つの要素型の幾つかの列挙型の属性として,複数回現れないことが望ましい。
属性宣言は,属性の指定が必すかどうかについての情報を与える。必すでない場合には,文書内で属性が指定されていないとき,XMLプロセサがどう処理することが望ましいかという情報も与える。
[60] | DefaultDecl |
::= | '#REQUIRED' | '#IMPLIED' | |
| (('#FIXED' S)? AttValue) |
[妥当性制約: 必す属性] | |||
[妥当性制約: 属性デフォルトの構文的な正しさ] | ||||
[整形式制約: 属性値に<を含まないこと] | ||||
[妥当性制約: 固定の属性デフォルト] |
属性宣言において,#REQUIREDはその属性が必すであること,#IMPLIEDはデフォルト値がないことを意味する。 宣言が#REQUIREDでも#IMPLIEDでもないときには,AttValueの値が,デフォルト値となる。#FIXEDキーワードは,その属性の値がデフォルト値と常に同一でなければならないことを示す。デフォルト値を宣言している場合,この属性が省略されているのを見つけたなら,宣言したデフォルト値が属性値に指定しているとして,XMLプロセサは振る舞うものとする。
宣言したデフォルト値は,宣言した属性型の構文的な制約を満たさなければならない。
型についての構文的な制約だけが要求されていることに注意。他の制約(例えばENTITY型の属性の値は,宣言された解析対象外実体の名前であること。)は,宣言されたデフォルト値が実際に使われたとき(この属性を指定しない要素が現れたとき。)に有効になる。
属性リスト宣言の例を,次に示す。
<!ATTLIST termdef id ID #REQUIRED name CDATA #IMPLIED> <!ATTLIST list type (bullets|ordered|glossary) "ordered"> <!ATTLIST form method CDATA #FIXED "POST">
属性値を応用プログラムに渡す前,又は妥当性を検証する前に, XMLプロセサは,次に示すアルゴリズムを適用することによって,属性値を正規化しなければならない。ただし,このアルゴリズムと同じ結果を応用プログラムに渡すなら,他の方法によって正規化してもよい。
a) |
すべての改行は入力の際に,2.11 行末の取扱いで記述されるとおりに#xAに正規化されなければならない。このアルゴリズムの残りの操作はこの方法で正規化されたテキストに対して行う。 | ||||||||
b) |
正規化された値は,空文字列であるとして処理を始める。 | ||||||||
c) |
正規化前の属性値にある,文字,実体参照及び文字参照に対して,先頭から最後まで次の処理を行う。
|
属性の型がCDATAでない場合は,XMLプロセサは正規化された属性値に対して,さらに次の処理をしなければならない。まず,先頭又は末尾にあるスペース文字(#x20)をすべて取り除く。次に,連続するスペース文字(#x20)を一つのスペース文字(#x20)に置き換える。
正規化前の属性値が,スペース(#x20)以外の空白文字への文字参照を含んでいるなら,正規化された値は参照された文字(#xD, #xA又は #x9)をそのまま含む。正規化前の値が,空白文字(参照ではなく)を含んでいるときは異なる結果になる。この場合,各空白文字は,正規化された値では,スペース文字(#x20)に置き換えられる。置換テキストがスペース文字を含む実体が,正規化前の値で参照されているときも異なる結果になる。この場合,正規化された値では,再帰的な処理によって,空白文字はスペース文字(#x20)に置き換えられる。
妥当性を検証しないプロセサは,宣言が見つからない属性は,すべて, CDATAと宣言しているとして扱うものとする。
属性が実体を参照しているとき,その実体の宣言をプロセサが読み込んでいないなら,誤りとする。これは,妥当性を検証しないプロセサを用いるときに限って起こりうる。
次に,属性の正規化についての例を示す。次の宣言がある場合を考える。
<!ENTITY d "
"> <!ENTITY a "
"> <!ENTITY da "
">
属性a
がNMTOKENSとして宣言されていれば,表1の左欄の属性指定は,中欄の文字の並びに正規化される。属性a
が
CDATAとして宣言されていれば,右欄の内容に正規化される。
属性指定 | aが NMTOKENS | aが CDATA |
---|---|---|
a="xyz" |
x y z |
#x20 #x20 x y z |
a="&d;&d;A&a; &a;B&da;" |
A #x20 B |
#x20 #x20 A #x20 #x20 #x20 B #x20 #x20 |
a= "

A

B
" |
#xD #xD A #xA #xA B #xD #xA |
#xD #xD A #xA #xA B #xD #xA |
a
がNMTOKENS型として宣言された場合,最後の例は,整形式ではあるが妥当ではないことに注意。
条件付きセクションとは,文書型宣言の外部サブセットの一部であって,制御キーワードの指定によって,DTDの論理構造に含まれるか又は除かれるかが変わる部分とする。
[61] | conditionalSect |
::= | includeSect
| ignoreSect
|
|
[妥当性制約: 条件付きセクション/パラメタ実体が厳密に入れ子をなすこと ] | ||||
[62] | includeSect |
::= | '<![' S? 'INCLUDE' S? '[' extSubsetDecl
']]>' | |
[63] | ignoreSect |
::= | '<![' S? 'IGNORE' S? '[' ignoreSectContents*
']]>' |
|
[妥当性制約: 条件付きセクション/パラメタ実体が厳密に入れ子をなすこと ] | ||||
[64] | ignoreSectContents |
::= | Ignore
('<![' ignoreSectContents
']]>' Ignore)* | |
[65] | Ignore |
::= | Char*
- (Char*
('<![' | ']]>') Char*)
|
妥当性制約: 条件付きセクション/パラメタ実体が厳密に入れ子をなすこと
条件付セクションの"<![
",
"[
"又は"]]>
"のいずれかがパラメタ実体参照の置換テキストに含まれるなら,すべてが同一のパラメタ実体の置換テキスト
に含まれなければならない。
条件付きセクションは,DTDの内部サブセット及び外部サブセットと同様に,完全な宣言,コメント,処理命令又は入れ子になった条件付きセクションを,幾つか含んでよい。これらの間に,空白が現れてもよい。
条件付きセクションのキーワードがINCLUDEならば,条件付きセクションの内容はDTDの一部である。条件付きセクションのキーワードがIGNOREならば,条件付きセクションの内容は論理的にはDTDの一部ではない。キーワードをINCLUDEとする条件付きセクションが,キーワードをIGNOREとするより大きな条件付きセクションに含まれるならば,外側及び内側の条件付きセクションの両方とも無視する。無視される条件付きセクションの内容を解析するとき,キーワードに続く"[
"の後のすべての文字は,条件付きセクションを開始する"<![
"と終了する"]]>
"を除き,この条件付きセクションの終了が見つかるまで無視する。この処理において,パラメタ実体参照は認識されない。
条件付きセクションのキーワードがパラメタ実体参照ならば,XMLプロセサは条件付きセクションを取り込むか無視するかを判断する前に,このパラメタ実体を展開しなければならない。
例を次に示す。
<!ENTITY % draft 'INCLUDE' > <!ENTITY % final 'IGNORE' > <![%draft;[ <!ELEMENT book (comments*, title, body, supplements?)> ]]> <![%final;[ <!ELEMENT book (title, body, supplements?)> ]]>
XML文書は,一つ以上の記憶単位から構成する。これらの記憶単位を,実体という。すべての実体は,内容 をもつ。文書実体及び外部DTDサブセットを除くすべての実体は,実体 名によって特定する。 各XML文書は,文書実体と呼ぶ実体を一つもつ。XMLプロセサは,この文書実体から処理を開始する。文書実体が,文書のすべてを含んでもよい。
実体は,解析対象実体又は解析対象外実体とする。解析対象実体の内容は,解析対象実体の置換テキストと呼ぶ。このテキストは,文書の本体の一部として解釈する。
解析対象外実体は,内容がテキストでもそうでなくともよいリソースとする。テキストの場合,XMLでなくともよい。各解析対象外実体には,記法が関連付けられ,この記法は,名前で特定する。XMLプロセサが実体や記法の識別子を応用プログラムに渡すという要件以外は,XMLは解析対象外実体の内容を制限しない。
解析対象実体は,実体参照によって名前で呼び出す。解析対象外実体は,ENTITY型又はENTITIES型の属性の値として,名前で呼び出す。
一般実体は,文書内容の中で使用する実体とする。あいまいにならない限り,この規格では,一般実体を単に実体と呼ぶ。パラメタ実体は,DTD内で使用する解析対象実体とする。これらの2種類の実体は,異なる書式で参照し,異なる文脈で認識される。さらに,それらは異なる名前空間にある。したがって,同じ名前のパラメタ実体と一般実体は,2つの異なった実体である。
文字参照は,JIS X 0221-1文字集合の特定の文字,例えば,入力機器から直接入力不可能な文字を参照する。
[66] | CharRef |
::= | '&#' [0-9]+ ';' | |
| '&#x' [0-9a-fA-F]+ ';' |
[整形式制約: 使用できる文字] |
文字参照を用いて参照する文字は,生成規則Charにマッチしなければならない。
文字参照が"&#x
"で始まれば,終端の;
までの数字及び字(letter)は,JIS X 0221-1の文字符号位置を16進数で表現する。文字が "&#
"
で始まれば,終端の;
までの数字は,文字符号位置を10進数で表現する。
実体参照は,名前の付いた実体の内容を参照する。一般解析対象実体への参照は,アンド記号(&
)及びセミコロン記号(;
)を区切り子として用いる。パラメタ実体への参照は,パーセント記号(%
)及びセミコロン(;
)を区切り子として用いる。
[67] | Reference |
::= | EntityRef
| CharRef | |
[68] | EntityRef |
::= | '&' Name
';' |
[整形式制約: 実体が宣言されていること] |
[妥当性制約: 実体が宣言されていること] | ||||
[整形式制約: 解析対象実体] | ||||
[整形式制約: 再帰なし] | ||||
[69] | PEReference |
::= | '%' Name
';' |
[妥当性制約: 実体が宣言されていること] |
[整形式制約: 再帰なし] | ||||
[整形式制約: DTDの中] |
DTDをもたない文書,パラメタ実体参照を含まない内部DTDサブセットだけをもつ文書又は"standalone='yes'
"をもつ文書において,外部サブセット又はパラメタ実体中に出現しない実体参照では,その実体参照のNameは,外部サブセット又はパラメタ実体で出現しない実体宣言にマッチしなければならない。ただし,整形式の文書は,実体amp
,
lt
, gt
, apos
,
quot
を宣言する必要はない。 一般実体の場合は,属性リスト宣言のデフォルト値内での参照より先に,宣言が現れなければならない。
パラメタ実体又は外部サブセットで出現する実体宣言の読み込み・処理を,妥当性を検証しないプロセサに義務づけてはいないことに注意。それらの文書では,実体は宣言されなければならないという規則は,standalone='yes'の場合だけ,整形式制約となる。
外部サブセット又は外部パラメタ実体をもち,さらに "standalone='no'
"をもつ文書において,実体参照で用いる Name
は,ある実体宣言に含まれる名前とマッチしなければならない。相互運用性のためには,妥当な文書は4.6 (定義済み実体)で指定した書式によって,実体 amp
, lt
, gt
,
apos
,
quot
を宣言することが望ましい。パラメタ実体の場合は,宣言は,参照より先に現れなければならない。同様に,一般実体の場合は,その一般実体への直接又は間接的な参照をともなったデフォルト値を含む属性リスト宣言よりも先に,宣言が現れなければならない。
パラメタ実体参照は,DTD内にだけ,出現してよい。
文字参照及び実体参照の例を,次に示す。
Type <key>less-than</key> (<) to save options. This document was prepared on &docdate; and is classified &security-level;.
パラメタ実体参照の例を,次に示す。
<!-- declare the parameter entity "ISOLat2"... --> <!ENTITY % ISOLat2 SYSTEM "http://www.xml.com/iso/isolat2-xml.entities" > <!-- ... now reference it. --> %ISOLat2;
[70] | EntityDecl |
::= | GEDecl|
PEDecl |
[71] | GEDecl |
::= | '<!ENTITY' S
Name
S
EntityDef
S?
'>' |
[72] | PEDecl |
::= | '<!ENTITY' S
'%' S
Name
S
PEDef
S?
'>' |
[73] | EntityDef |
::= | EntityValue
| (ExternalID
NDataDecl?) |
[74] | PEDef |
::= | EntityValue
| ExternalID |
Nameは,実体参照において実体を特定する。解析対象外実体ならば,ENTITY 型又はENTITIES型の属性値において,Name実体を特定する。同一の実体が1回以上宣言されれば,最初の宣言を用いる。利用者の任意選択によっては,複数回宣言される実体に関し,XMLプロセサは,警告を出してもよい。
実体の定義が EntityValueのとき,これを内部実体という。これは,別個の物理的記憶単位をもたず,実体の内容は宣言内で与える。正しく置換テキストを生成するには,リテラル実体値内での実体参照及び文字参照の処理が必要となるかもしれないことに注意する。詳細は,4.5 (実体置換テキストの構築)を参照。
内部実体は,解析対象実体とする。
内部実体宣言の例を,次に示す。
<!ENTITY Pub-Status "This is a pre-release of the specification.">
内部実体でない実体は外部実体であって,次のとおりに宣言する。
[75] | ExternalID |
::= | 'SYSTEM' S
SystemLiteral | |
| 'PUBLIC' S
PubidLiteral
S
SystemLiteral
| ||||
[76] | NDataDecl |
::= | S
'NDATA' S
Name |
[妥当性制約: 記法が宣言されていること] |
NDataDecl が存在すれば,この実体は,一般解析対象外実体とし,そうでなければ,解析対象実体とする。
SystemLiteral
を,実体のシステム識別子と呼ぶ。XMLプロセサが,実体の置換テキストを生成するには,入力を必要とする。入力を得るためにシステム識別子を参照する処理の一部として,統一資源識別子(URI)参照([IETF
RFC 2396]で定義され,[IETF
RFC 2732]で改訂された。) に変換してから参照することが意図されている。
素片識別子(#
文字で始まるもの。)がシステム識別子に含まれることは誤りとする。
この規格の適用範囲外の情報(例えば,ある特定のDTDの特別なXML要素又は特定の応用プログラムの仕様によって定義された処理命令)によって上書きされない限り,相対的な統一資源識別子(URI)は,その実体の位置,すなわち,その実体宣言が現れる資源に相対的とする。実体宣言が現れる資源とは,この実体宣言を宣言として構文解析した時点で,先頭の'<'
を含む外部実体とする。
したがって,統一資源識別子(URI)は,文書実体・外部DTDサブセットを含む実体・なんらかの外部パラメタ実体に対して相対的とする。統一資源識別子(URI)によって特定される資源を得ようとするとき,パーサのレベルでリダイレクトされてもよく(例えば,実体リゾルバ),下位プロトコルのレベル(例えば,HTTPのLocation:ヘッダ)によってリダイレクトされてよもよい。この規格の適用範囲外の付加的な情報が資源の中に存在しない限り必ず,リソースの基底統一資源識別子(URI)は実際に返されたリソースの統一資源識別子(URI)とする。言い換えれば,すべてのリダイレクションが起こったあとで得られるリソースの統一資源識別子(URI)とする。
システム識別子(及び他の統一資源識別子(URI)参照として使用されるXML文字列)が含む文字の幾つかは,[IETF
RFC 2396]及び[IETF
RFC 2732]に従えば,参照された資源を得るために統一資源識別子(URI)を使用する前に別扱いする必要がある。これらの別扱いが必要な文字は,
#x0
から
#x1F
までの制御文字(そのほとんどはXMLでは出現できない。),スペース#x20
,区切り子('<'
#x3C
,'>' #x3E
及び '"' #x22
),unwise文字(
'{' #x7B
,'}' #x7D
,'|' #x7C
,'\'
#x5C
(バックスラッシュ),'^' #x5E
及び '`' #x60
)並びに
#x7F
を超える文字とする。
別扱いは常にまったく可逆的な処理であるというわけではないので,絶対に必要なときに限って,できるだけ後の段階で別扱いを行うものとする。特に,相対的な統一資源識別子(URI)を絶対的なものに変換する処理は,別扱いを起動しないことが望ましい。統一資源識別子(URI)参照を参照するプロセス又はソフトウェア部品に統一資源識別子(URI)参照を渡す処理も,別扱いを起動しないことが望ましい。別扱いが本当に起きるときは,次のとおり行わなければならない。
a) |
文字は,それぞれUTF-8 [Unicode3] に従って1バイト又はそれ以上のバイトに変換する。 |
b) |
バイト列はすべて,統一資源識別子(URI)の別扱いメカニズムによって別扱いする(つまり, |
c) |
元の文字は,この結果として得られる文字列に置き換える。 |
システム識別子以外に,外部実体は,公開識別子を含んでもよい。 実体の内容を取り出す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 >
外部解析対象実体は,テキスト宣言で始まることが望ましい 。
[77] | TextDecl |
::= | '<?xml' VersionInfo?
EncodingDecl
S?
'?>' |
テキスト宣言は,そのままの形で現れなければならず,解析対象実体への参照を経由してはならない。外部解析対象実体において,テキスト宣言は,先頭以外のいかなる位置にも出現しない。外部解析対象実体中のテキスト宣言は,置換テキストに含まれるとは見なさない。
ラベルdocumentをもつ生成規則にマッチすれば,文書実体は整形式とする。ラベルextParsedEntをもつ生成規則にマッチすれば,外部の一般解析対象実体は,整形式とする。すべての外部パラメタ実体は整形式になるように定義されていることに注意。
[78] | extParsedEnt |
::= | TextDecl?
content |
置換テキストが,ラベルcontentをもつ生成規則にマッチすれば,内部の一般解析対象実体は,整形式とする。すべての内部のパラメタ実体は,定義から整形式になる。
一般実体はすべて整形式なので,XML文書の論理的及び物理的構造は,厳密に入れ子となる。開始タグ,終了タグ,空要素タグ,要素,コメント,処理命令,文字参照及び実体参照が,一つの実体で開始し,別の実体で終了することはない。
XML文書内の外部解析対象実体は,それぞれ別の文字符号化を用いてもよい。すべてのXMLプロセサは,UTF-8で符号化した実体,及びUTF-16で符号化した実体を処理できなければならない。この規定での"UTF-8"及び"UTF-16"という用語は,他のラベルをもつ符号化には適用されない。その符号化がどれほど "UTF-8"又は"UTF-16"に類似していても,適用されない。
UTF-16で符号化した実体は,[JIS X 0221-1:2001]の附属書H, [Unicode]の2.4, [Unicode3]の2.7で規定する“印”(しるし)(ZERO WIDTH NO-BREAK SPACE文字,#xFEFF)で始まらなければならない。UTF-8で符号化した実体は,“印”(しるし)で始まってもよい。これは,符号化の印であって,XML文書のマーク付けの一部でも,文字データの一部でもない。XMLプロセサは,この文字を使用して,UTF-8で符号化した文書とUTF-16で符号化した文書との区別を行なえなければならない。
XMLプロセサは,UTF-8及びUTF-16で符号化した実体を読めなければならない。他の符号化が世界では用いられることも多く,それらの符号化を用いる実体をXMLプロセサは処理できることが望ましい。外部の文字符号化情報(MIMEヘッダなど)がない場合,UTF-8又はUTF-16以外の符号化を用いて格納する解析対象実体は,符号化宣言を含むテキスト宣言 (4.3.1 (テキスト宣言)を参照。)で始めなければならない。
[80] | EncodingDecl |
::= | S
'encoding' Eq
('"' EncName
'"' | "'" EncName
"'") | |
[81] | EncName |
::= | [A-Za-z] ([A-Za-z0-9._] | '-')* |
/* ラテン文字だけを含む符号化名 */ |
文書実体では,符号化宣言は,XML宣言の一部として含まれる。EncNameは,使用する符号化の名前とする。
符号化宣言では,値"UTF-8
","UTF-16
","ISO-10646-UCS-2
"及び"ISO-10646-UCS-4
"は,Unicode及びJIS X 0221-1の各種符号化のために用いる。値 "ISO-8859-1
", "ISO-8859-2
", ...
"ISO-8859-
n"(ここでnはパート番号とする。)は,ISO
8859の対応するパートのために用いる。値"ISO-2022-JP
","Shift_JIS
"及び"EUC-JP
"は,JIS X 0208-1997の各種符号化のために用いる。インタネット割当て番号主体(Internet Assigned Numbers Authority)[IANA-CHARSETS]
に,(charsetsとして)登録された文字符号化については,ここに挙げたもの以外についても,登録された名前で参照することが望ましい。それ以外の符号化は,接頭辞"x-"で始まる名前を使うことが望ましい。XMLプロセサは,文字符号化の名前を大文字・小文字の区別をせずにマッチをとることが望ましい。IANAに登録された名前は,IANAにその名前で登録された符号化を示すと解釈する,又は不明であるとして扱うことが望ましい(もちろん,IANAに登録されたすべての符号化の実装をプロセサ
に要求するものではない。)。
外部の伝送プロトコル(すなわち,HTTP, MIMEなど)で与えられる情報が存在しない場合,XMLプロセサに渡された実体が,符号化宣言を含むにもかかわらず,宣言で示したもの以外の方式で符号化されているとき,又は“印”(しるし)でも符号化宣言でも始まらない実体が,UTF-8以外の符号化を使用したときは,誤りとする。ASCIIはUTF-8のサブセットなので,通常のASCIIの実体は厳密には符号化宣言を必要としないことに注意。
TextDeclが外部実体の先頭以外の場所に出現することは, 致命的な誤りとする。
処理できない符号化を使用した実体をXMLプロセサが発見したときは,致命的な誤りとする。XML実体が(デフォルトで,符号化宣言によって,又はより高次のプロトコルによって)ある符号化であると確定されるが,その符号化としては正しくないオクテット列を含む場合は,致命的な誤りとする。特に,UTF-8で符号化された実体が,不正であるとUnicode 3.1で定義されたコードユニット列を含むことは致命的な誤りとする。上位のプロトコルによって符号化が決まらない場合,符号化宣言を含まないXML 実体が,正しいUTF-8又はUTF-16の内容をもたないときも,致命的な誤りとする。
符号化宣言を含むテキスト宣言の例を次に示す。
<?xml encoding='UTF-8'?> <?xml encoding='EUC-JP'?>
表2に,文字参照,実体参照及び解析対象外実体の呼出しが現れる文脈,並びに,それぞれの場合におけるXMLプロセサに要求される振る舞いを要約する。一番左の列のラベルは,参照が現れる文脈を示す。
参照ではなく,Nameとして出現。ENTITY型として宣言した属性の値として出現するか,又はENTITIES型として宣言した属性の値におけるスペースで区切られたトークンの一つとして出現する。
実体の宣言における,パラメタ実体又は内部実体のリテラル実体値の中での参照。非終端記号EntityValueに対応する。
DTDの内部又は外部サブセットのいずれかの中に現われる参照。ただし,EntityValue, AttValue, PI, Comment, SystemLiteral, PubidLiteral又は無視される条件付きセクションの内容の外側にあるもの(3.4 (条件付きセクション)を参照。)に限る。
実体の型 | 文字 | ||||
パラメタ | 内部一般 | 外部解析対象実体一般 | 解析対象外実体 | ||
内容での参照 | 認識 しない | 取込み | 検証のために取込み | 禁止 | 取込み |
属性値での参照 | 認識 しない | リテラル内での取込み | 禁止 | 禁止 | 取込み |
属性値として出現 | 認識 しない | 禁止 | 禁止 | 通知 | 認識しない |
実体値での参照 | リテラル内での取込み | 処理しない | 処理しない | 禁止 | 取込み |
DTDでの参照 | PEとして 取込み | 禁止 | 禁止 | 禁止 | 禁止 |
DTDの外では,%
文字は,いかなる特別な意味ももたない。したがって,DTDの中ではパラメタ実体参照として認識するものであっても,contentの中ではマーク付けとしては認識しない。同様に,適切に宣言した属性の値の中に現れる場合を除き,解析対象外実体の名前は認識しない。
実体参照を処理するには,その置換テキストを取り出し,処理する。参照自体の代わりに,参照があった位置で,文書の一部として含まれるものとして取り込む。置換テキストは,文字データ及び(パラメタ実体以外の)マーク付けのいずれを含んでもよく,これらは,通常の方法で認識されなければならない
(文字列"AT&T;
"は,"AT&T;
"に展開され,残されたアンパサンドは,実体参照の区切り子としては認識しない。)。文字参照は,番号で示した文字を参照自体の代わりに取り込む。
文書の妥当性を検証するには,XMLプロセサは,解析対象実体への参照を認識したとき,その置換テキストを取り込まなければならない。実体が外部実体であって,XML文書の妥当性を検証しないときは,実体の置換テキストを取り込んでもよいが,取り込むことを義務づけられてはいない。妥当性を検証しないプロセサが置換テキストを取り込まない場合,実体を認識したが,読み込まなかったことを応用プログラムに通知しなければならない。
この取決めは,SGML及びXMLの実体の機構が提供する自動取込み機能が,文書作成時のモジュール化を主な目的として設計されており,その他の応用プログラム(特に,文書のブラウジング)には,必ずしも適切ではない,という認識による。例えば,ブラウザは外部解析対象実体への参照を見つけると,その実体が存在するという表示だけを行い,表示を要求されたときにだけ,内容を取り出してもよい。
次のものは禁止されており,致命的な誤りとする。
a) |
解析対象外実体への参照の出現。 |
b) |
DTDのEntityValue又はAttValue以外の部分における,文字参照又は一般実体への参照の出現。 |
c) |
属性値内の外部実体への参照の出現。 |
実体参照が属性値の中で現れたとき,又は,パラメタ実体への参照がリテラル実体値の中で現れたとき,置換テキストは,参照自体の代わりに,参照があった位置に文書の一部としてあったものとして処理される。ただし,置換テキストの中の一重引用符又は二重引用符文字は,常に通常の文字データとして扱われ,リテラルを終了させることはない。例えば,次の文書例は整形式である。
<!ENTITY % YN '"Yes"' > <!ENTITY WhatHeSaid "He said %YN;" >
一方,次の例は整形式ではない。
<!ENTITY EndAttr "27'" > <element attribute='a-&EndAttr;>
解析対象外実体の名前が,ENTITY型又はENTITIES型の属性値においてトークンとして現れたとき,妥当性を検証するプロセサは,応用プログラムに対して,その実体及び関連する記法のシステム識別子並びに(存在すれば)公開識別子を通知しなければならない。
一般実体参照が,実体宣言におけるEntityValue内に現れるとき,一般実体参照は処理されないで,そのまま残る。
外部解析対象実体の場合と同様に,パラメタ実体は,妥当性を検証するときだけ取り込む必要がある。パラメタ実体参照をDTD内に認識して取り込むとき,その置換テキストは,その前後に一つのスペース文字(#x20)の付加によって引き伸ばされる。パラメタ実体の置換テキストがDTD内の文法的トークンを完全に含むようにすることを,この規定は意図している。この振る舞いは,実体値の中でのパラメタ実体参照には適用されない。この場合については4.4.5 (リテラル内での取込み)で記述する。
実体の取扱いの規定で,実体値を二つの形式に区別することは役に立つ。内部実体の場合,リテラル実体値は,実体宣言内に実際に存在する,引用符で囲まれた文字列とする。これは,非終端記号EntityValueとマッチする。外部実体の場合,リテラル実体値は,その実体に含まれるテキストそのままとする。 内部実体の場合,置換テキストは,文字参照及びパラメタ実体参照の置換え後における,実体の内容とする。外部実体の場合, 置換テキストは,実体の内容とする。ただし,テキスト宣言は(もしあるなら)取り除く(周辺の空白文字は除かない。)。しかし,文字参照又はパラメタ実体参照は置き換えないものとする。
内部実体宣言内で与えるリテラル実体値(EntityValue)は,文字参照,パラメタ実体参照及び一般実体参照を含んでもよい。これらの参照は,リテラル実体値内に完全に含まれていなければならない。先に示したとおりに取り込まれる(又は リテラル内で取込まれる)実際の置換テキストは,参照されるパラメタ実体の置換テキストを含み,リテラル実体値に含まれる文字参照の代わりにそれが表す文字を含む。しかし,一般実体参照はそのまま残し,展開してはならない。例えば,次の宣言を与えたとする。
<!ENTITY % pub "Éditions Gallimard" > <!ENTITY rights "All rights reserved" > <!ENTITY book "La Peste: Albert Camus, © 1947 %pub;. &rights;" >
実体の置換テキスト"book
"は,次のとおりとなる。
La Peste: Albert Camus, © 1947 Éditions Gallimard. &rights;
参照"&book;
"が文書の内容又は属性値内に出現すれば,一般実体参照"&rights;
"は展開される。
これらの単純な規則は,複雑な相互作用をもちうる。 難しい例についての詳細は,附属書D (実体参照及び文字参照の展開)を参照。
すべてのXMLプロセサは,宣言されているかどうかに関係なく,これらの実体を認識しなくてはならない。相互運用性のためには,妥当なXML文書は,これらの実体を使用する前に他の実体と同様に宣言することが望ましい。実体
lt
又はamp
を宣言する場合,内部実体として宣言し,その置換テキストは,別扱いされる文字(不等号(より小)又はアンパサンド)
への文字参照としなければならない。これらの実体を参照しても結果が整形式となるためには,二重の別扱いを必要とする。実体gt
,
apos
又は
quot
を宣言する場合,これらの実体を内部実体として宣言し,その置換テキストは,別扱いされる単一の文字(又はその文字への文字参照)としなければならない。この場合,二重の別扱いは不要であるが,有害ではないことに注意。次にその例を示す。
<!ENTITY lt "&#60;"> <!ENTITY gt ">"> <!ENTITY amp "&#38;"> <!ENTITY apos "'"> <!ENTITY quot """>
記法は,解析対象外実体の形式,記法属性を持つ要素の形式又は処理命令の対象とする応用プログラムを特定する名前とする。
[82] | NotationDecl |
::= | '<!NOTATION' S
Name
S
(ExternalID
| PublicID)
S?
'>' |
[妥当性制約: 記法名の一意性] |
[83] | PublicID |
::= | 'PUBLIC' S
PubidLiteral
|
あるNameを宣言できるのは,ただ一つの記法宣言とする。
宣言されていて,属性値・属性定義・実体宣言で参照されているすべての記法について,XMLプロセサは,記法の名前及び外部識別子を応用プログラムに提供しなければならない。さらに,外部識別子を, システム識別子,ファイル名又はその他の情報(その記法のデータを処理するプロセサを応用プログラムが起動するために必要なもの)に展開してもよい。しかし,XMLプロセサ又は応用プログラムが動作するシステムでは利用できない記法を,XML文書が宣言し,参照しても,誤りとはしない。
文書実体は,実体の成す木構造のルートであって,XMLプロセサが処理を開始する対象とする。この規格は,XMLプロセサが,文書実体の存在する場所をどのように見つけるかは規定しない。他の実体と異なり,文書実体は名前をもたず,いかなる識別子もなしにプロセサへの入力ストリームに出現してもよい。
適合XMLプロセサは,妥当性を検証するもの及び妥当性を検証しないものの二つに分類される。
妥当性を検証するプロセサも妥当性を検証しないプロセサも,読み込んだ文書実体及び他のすべての解析対象実体において,この規格の整形式制約への違反を報告しなければならない。
利用者の任意選択によっては,妥当性を検証するプロセサは,DTD内の宣言によって示された制約への違反と,この規格が規定する妥当性制約への違反とを,すべて報告しなければならない。 これを実現するために,妥当性を検証するXMLプロセサは,DTD全体と文書内で参照されているすべての外部解析対象実体とを読み込んで処理しなければならない。
妥当性を検証しないプロセサは,整形式であることを確認するために,DTDの内部サブセット全体を含めた文書実体を調べることだけが義務づけられている。文書の妥当性を確認する必要はないが,読み込んでいないパラメタ実体への参照が最初に起きるまでに読み込んだDTDの内部サブセットとパラメタ実体とに現れるすべての宣言を処理しなければならない。すなわち,属性値を正規化し,内部実体の置換テキストを取込み,デフォルトの属性値を与えるために,これらの宣言にある情報を使用しなければならない。
実体の宣言は上書きされる可能性があるので,妥当性を検証しないプロセサは,読み込んでいないパラメタ実体への参照より後に現れた実体宣言及び属性リスト宣言を処理してはならない。ただし,standalone="yes"
のときは処理しなければならない。
妥当性を検証するXMLプロセサの振る舞いはほとんど予測可能である。すなわち,文書のすべての断片を読み込み,整形式及び妥当性に対するすべての違反を報告しなければならない。妥当性を検証しないプロセサに必要とされることはそれより少ない。すなわち,文書実体以外の文書の断片を読み込む必要はない。したがって,XMLプロセサの利用者に対して重要な二つ効果をもつ。
a) |
ある種の整形式の誤り,特に,外部実体を読まなければ検出できない誤りを検出することに,妥当性を検証しないプロセサは失敗してもよい。実体が宣言されていること,解析対象実体及び再帰なしという見出しが付けられた制約,並びに4.4 XMLプロセサによる実体及び参照の扱いで禁止として説明されている幾つかの場合が,この種の誤りに相当する。 |
b) |
プロセサから応用プログラムに渡される情報は,プロセサがパラメタ実体及び外部実体を読み込むかどうかで異なる。例えば,妥当性を検証しないプロセサは,属性値を正規化したり,内部実体の置換テキストを取込んだり,デフォルトの属性値を与えることに失敗してもよい。失敗してよいかどうかは,外部実体及びパラメタ実体内での宣言を既に読み込んでいるかどうかによって決まる。 |
異なるXMLプロセサ間での相互運用性を最も高めるためには,妥当性を検証しないプロセサを使用する応用プログラムは,そのようなプロセサでは必要とされない振る舞いに依存すべきではない。DTD機能のうち検証に関係しないもの(デフォルトをもつ属性の宣言及び内部実体の宣言など)であって, 外部実体に定義されている又は定義されている可能性があるものを必要とする応用プログラムは,妥当性を検証するプロセサを使用することが望ましい。
XMLの形式的な文法は,簡単な拡張Backus-Naur Form(EBNF)記法によって与える。文法の各規則は,次の形式で記号を定義する。
symbol ::= expression
記号は,正規言語の開始記号であるときは大文字で始め,そうでなければ小文字で始める。リテラル文字列は引用符で囲む。
規則の右辺では,一つ以上の文字からなる文字列とマッチするために,次の式を使用する。
#xN
ここで,Nは16進の整数とする。この式は,JIS X 0221-1における値(コード位置)がNである文字とマッチする。
[a-zA-Z]
, [#xN-#xN]
指定した範囲の値(両端の値を含む。)をもつ任意のCharとマッチする。
[abc]
,
[#xN#xN#xN]
列挙された複数の文字のうち,いずれかの値をともなうCharとマッチする。列挙指定及び範囲指定を,一組の角カッコの中に混在させることができる。
[^a-z]
, [^#xN-#xN]
指定した範囲外の値をもつ任意のCharとマッチする。
[^abc]
, [^#xN#xN#xN]
指定した文字以外の値をもつ任意のCharとマッチする。禁止される値の列挙指定と範囲指定を,ひと組の角カッコの中に混在させることができる。
"string"
二重引用符で囲むリテラル文字列とマッチする。
'string'
一重引用符で囲むリテラル文字列とマッチする。
これらの記号を,次のとおりに組み合わせて,複合パターンを作ってもよい。ここで,A
及びB
は式とする。
expression
)
ここに示す組合せによる式(expression
)を,一つのまとまりとして扱うために使う。
A?
A
又は空列とマッチする(任意選択のA
)。
A B
A
の次にB
が出現するものとマッチする。このオペレータは,選択よりも高い優先度をもつ。したがって,A B | C D
と(A B) | (C
D)
は等しい。
A | B
A
又はB
のどちらかとマッチする。
A - B
A
とマッチするがB
とはマッチしない任意の文字列とマッチする。
A+
A
の1回以上の繰返しとマッチする。連結は選択より高いも優先度をもつ。したがって,
A+ | B+
は (A+) | (B+)
と等しい。
A*
A
の0回以上の繰返しとマッチする。連結は選択より高いも優先度をもつ。したがって,
A* | B*
は (A*) | (B*)
と等しい。
生成規則内で使用する他の記法を次に示す。