拡張可能マークアップ言語 1.0


W3CREC-xml-19980210


拡張可能マークアップ言語 (Extensible Markup Language) 1.0

W3C勧告 1998年2月10日

このバージョン(原文):
http://www.w3.org/TR/1998/REC-xml-19980210
http://www.w3.org/TR/1998/REC-xml-19980210.xml
http://www.w3.org/TR/1998/REC-xml-19980210.html
http://www.w3.org/TR/1998/REC-xml-19980210.pdf
http://www.w3.org/TR/1998/REC-xml-19980210.ps
最新のバージョン:
http://www.w3.org/TR/REC-xml
以前のバージョン:
http://www.w3.org/TR/PR-xml-971208
編集者:
Tim Bray (Textuality and Netscape) <tbray@textuality.com>
Jean Paoli (Microsoft) <jeanpa@microsoft.com>
C. M. Sperberg-McQueen (University of Illinois at Chicago) <cmsmcq@uic.edu>

概要

拡張可能マークアップ言語 (XML. Extensible Markup Language) は、SGMLのサブセットであり、この文書の中で完全に記述されている。その目的は、現在HTMLで可能な方法を以って一般性を有するSGMLをウェブ上で配信し、受信し、処理できるようにすることである。XMLは、実装の容易さと、SGMLとHTMLの双方との相互運用性とを目指して設計されている。

この文書の位置づけ

この文書は、W3C会員およびその他の利害関係者によって検討され、ディレクターによってW3C勧告として公布されているものである。この文書は安定的であって、参照資料として用いたり、他の文書からの規範的リファレンスとして引用してもよい。勧告作成におけるW3Cの役割は、仕様書に注意をひき、その広範な配備を推進することである。これはウェブの機能性と相互運用性を拡張するものである。

この文書は、広く用いられている既存の国際的なテキスト処理規格 (Standard Generalized Markup Language, ISO 8879:1986(E) as amended and corrected) をWWW上での使用のためにサブセット化することにより作成された文法を規定する。これはW3CのXMLアクティビティの産物である。XMLアクティビティの詳細は、http://www.w3.org/XML で見ることができる。現行のW3C勧告およびその他の技術文書のリストは、http://www.w3.org/TR で見ることができる。

この仕様書はURIという用語を使っている。この用語は、[IETF RFC1738][IETF RFC1808] を置き換えるものと期待される進行中の作業 [Berners-Lee et al.] によって定義されている。

この仕様書内の既知のエラーの一覧は、http://www.w3.org/XML/xml-19980210-errata で入手可能である。

この文書(原文)のエラーは、xml-editor@w3.org までレポートいただきたい。

拡張可能マークアップ言語 1.0

目次

1. 序論
    1.1 起源と目標
    1.2 用語
2. 文書
    2.1 整形式のXML文書
    2.2 キャラクタ
    2.3 共通の文法的構造
    2.4 キャラクタデータ、マークアップ
    2.5 注釈
    2.6 処理命令
    2.7 CDATA 部
    2.8 前書き、文書型宣言
    2.9 スタンドアローン文書宣言
    2.10 空白の扱い
    2.11 行末の扱い
    2.12 言語識別子
3. 論理的構造
    3.1 開始タグ、終了タグ、空要素タグ
    3.2 要素型宣言
        3.2.1 要素の内容
        3.2.2 混在内容
    3.3 属性リスト宣言
        3.3.1 属性型
        3.3.2 属性デフォルト
        3.3.3 属性値の標準化
    3.4 条件的セクション
4. 物理的構造
    4.1 キャラクタ参照、実体参照
    4.2 実体宣言
        4.2.1 内部実体
        4.2.2 外部実体
    4.3 解析される実体
        4.3.1 テキスト宣言
        4.3.2 整形式の解析される実体
        4.3.3 実体内のキャラクタエンコーディング
    4.4 XMLプロセッサの実体および参照の扱い
        4.4.1 認識されない
        4.4.2 取り込まれる
        4.4.3 妥当性を検証するならば取り込まれる
        4.4.4 禁止
        4.4.5 リテラルに取り込まれる
        4.4.6 通知する
        4.4.7 バイパスされる
        4.4.8 PEとして取り込まれる
    4.5 内部実体置換テキストの構造
    4.6 定義済み実体
    4.7 表記法宣言
    4.8 文書実体
5. 適合性
    5.1 妥当性を検証するプロセッサと検証しないプロセッサ
    5.2 XMLプロセッサの利用
6. 表記法

付録

A. 参照資料
    A.1 規範的な参照資料
    A.2 それ以外の参照資料
B. キャラクタクラス
C. XMLとSGML(参考)
D. 実体およびキャラクタ参照の展開(参考)
E. 決定的内容モデル(参考)
F. キャラクタエンコーディングの自動検知(参考)
G. W3C XMLワーキンググループ(参考)

1. 序論

拡張可能マークアップ言語 (Extensible Markup Language) は、XMLと略称されるものであり、XML文書と呼ばれるデータオブジェクトのクラスを記述し、一部それを処理するコンピュータプログラムの挙動を記述するものである。XMLは、SGML (the Standard Generalized Markup Language [ISO 8879]) の応用プロファイルあるいは制限形態である。構造により、XML文書は適合的なSGML文書である。

XML文書は、実体 (entity) と呼ばれる記憶単位からなり、実体は解析され、または解析されないデータを包含する。解析されるデータはキャラクタからなり、キャラクタのうちのあるものはキャラクタデータを形成し、あるものはマークアップを構成する。マークアップは、文書の記憶レイアウトや論理的構造の記述をエンコードする。XMLは、記憶レイアウトや論理的構造に制約を課すための機構を提供する。

XMLプロセッサ (XML processor) と呼ばれるソフトウェアモジュールは、XML文書を読んでその内容と構造へのアクセスを提供するために使われる。 XMLプロセッサはアプリケーション (application) と呼ばれる他モジュールのためにその仕事をするものと考えられる。この仕様書は、XMLプロセッサの必須の挙動を、それがXMLデータをどのように読まなければならないか、またアプリケーションに提供しなければならない情報という観点で記述する。

1.1 起源と目標

XMLは、W3C (the World Wide Web Consortium) の賛助の下で1996年に構成されたXMLワーキンググループ(もともとは the SGML Editorial Review Board として知られていた)によって開発された。議長は Sun Microsystems の Jon Bosak が務め、これもまたW3Cによって組織された XML Special Interest Group(以前は the SGML Working Group として知られていた)の活発な参加を得た。XMLワーキンググループのメンバー表は付録に与えられている。Dan Connolly がワーキンググループのW3Cとの連絡役として働いた。

XMLについての設計目標は、こうである。

  1. XMLは、インターネット上でそのまま利用可能であること。
  2. XMLは、広範多様なアプリケーションをサポートすること。
  3. XMLは、SGMLと互換的であること。
  4. XML文書を処理するプログラムを書くことは、簡単であること。
  5. XMLにおける任意的な機能の数は絶対的最小限に、理想的には0にとどめられるべきである。
  6. XML文書は、人間が読み書きでき、相当程度に明快であるべきである。
  7. XMLの設計は、迅速に準備されるべきである。
  8. XMLの設計は、形式的かつ簡潔であること。
  9. XML文書は、作成しやすいこと。
  10. XMLマークアップの簡潔さは、最低限の重要性しかない。

この仕様書は、関連する規格(キャラクタについては Unicode と ISO/IEC 10646、言語識別タグについては Internet RFC 1766、言語名コードについては ISO 636、国別コードについては ISO 3166)とともに、 XMLバージョン 1.0 を理解し、それを処理するコンピュータプログラムを構築するために必要なすべての情報を提供する。

このバージョンのXML仕様書は、すべてのテキストと法律上の注意とに手が付けられない限り、自由に配布してもよい。

1.2 用語

XML文書を記述するために使われる用語は、この仕様書の本文に定義されている。以下のリストで定義されている用語は、それらの定義を構築したり、XMLプロセッサの行動を記述する際に使われるものである。

してもよい (may)
適合的な文書およびXMLプロセッサは、記述された通りに動作することを許されるが、動作する必要はない。
しなければならない (must)
適合的な文書およびXMLプロセッサは、記述された通りに動作することが要求される。さもなくばエラーである。
エラー (error)
この仕様書のルールの違反。結果は定義されない。適合的なソフトウェアは、エラーを探知して報告してもよく、またエラーから回復してもよい。
致命的エラー (fatal error)
適合的なXMLプロセッサが探知してアプリケーションに報告しなければならないエラー。致命的エラーに遭遇した後、プロセッサは、さらなるエラーを探すためにデータ処理を継続してもよく、そうしたエラーをアプリケーションに報告してもよい。エラー訂正をサポートするため、プロセッサは、文書からの未処理データ(キャラクタデータとマークアップが混じりあっている)をアプリケーションから利用可能にしてもよい。しかしながら、いったん致命的エラーが探知されれば、プロセッサは通常の処理を継続してはならない (すなわち、プロセッサは、キャラクタデータや文書の論理的構造についての情報を、アプリケーションに通常の方法で渡しつづけてはならない)。
ユーザの選択により (at user option)
適合的なソフトウェアは、記述された通りに動作してもよく、あるいは動作しなければならない(文章内の助動詞 (modal verb) に依存する)。もしそう動作するのであれば、プロセッサは、記述されている挙動を可能または不能にする手段をユーザに提供しなければならない。
妥当性制約 (validity constraint)
すべての妥当なXML文書に適用される規則。妥当性制約の違反はエラーである。それらは、ユーザの選択により、妥当性を検証するXMLプロセッサにより報告されなくてはならない。
整形式性制約 (well-formedness constraint)
すべての整形式のXML文書に適用される規則。整形式性制約の違反は致命的エラーである。
合致する (match)
(文字列または名前が-) 比較されている2つの文字列または名前は、同一でなくてはならない。ISO/IED 10646 において取りうる複数の表現をもつキャラクタ(例.構成済み形式と基礎+発音符形式の両方があるキャラクタ)は、それらが両方の文字列において同じ表現をもつ場合に限り、合致する。ユーザの選択により、プロセッサは、そうしたキャラクタをある標準形式に標準化してもよい。大文字小文字の揃えは実施されない。(文法規則中の文字列または規則が-) 文字列は、それが文法規則的生成規則 (gramatical production) によって生成される言語に属するならば、その生成規則に合致する。(内容または内容モデルが-) 要素は、それが "Element Valid" 制約に記述されている様式で適合しているとき、その宣言に合致する。
互換性のため (for compatibility)
XMLがSGMLと互換性を保つことを保障するためだけに組み込まれたXMLの機能。
相互運用性のため (for interoperability)
ISO 8879 への WebSGML Adaptations Annex 以前からあるSGMLプロセッサの既存のインストールベースによってXML文書を処理できる可能性を高めるために組み込まれた非拘束的勧告。

2. 文書 (document)

データオブジェクトは、それがこの仕様書において定義されているように整形式であれば、XML文書 (XML document) である。整形式のXML文書は、一定の踏み込んだ制約に沿えば、さらに妥当である場合がある。

各XML文書は、論理的構造と物理的構造との双方を有する。物理的には、文書は、実体 (entity) と呼ばれる記憶単位から構成される。実体は、他の実体を参照 (refer) して、それを文書に組み込んでもよい。文書は "root" または文書実体 (document entity) において開始する。論理的には、文書は、宣言や要素、注釈、キャラクタ参照、処理命令から構成される。これらのものはすべて明示的なマークアップによって文書内に示される。論理的構造および物理的構造は、"4.3.2 Well-Formed Parsed Entities" において記述されている通り、適切にネストされなくてはならない。

2.1 整形式XML文書

テキストオブジェクトは、

  1. 全体として見て document という生成規則に合致する
  2. この仕様書において与えられている整形式性制約すべてに沿う
  3. 文書内部で直接または間接に参照されている解析される実体がそれぞれ整形式である
ならば、整形式のXML文書である。
文書
[1]  document ::= prolog element Misc*

document 生成規則に合致するとは、

  1. 1つ以上の要素を包含する
  2. root と呼ばれる要素または文書要素がちょうど1つあり、そのどの部分も他の要素の内容の中に現れない。他のすべての要素について、開始タグが他の要素の内容の中にあれば、終了タグが同じ要素の内容の中にある。単純にいうと、開始タグと終了タグとで区切られた要素は、互いに適切にネストされなければならない。
ことを意味する。

この結果として、非ルート要素Cそれぞれについて、 Cは、Pの内容の中にあるけれども、Pの内容の中にある他のどの要素の内容の中にもないといった他の要素Pが、文書内に1つある。PC親 (parent)といい、CP子 (chile)という。

2.2 キャラクタ

解析される実体は、テキスト (text) すなわち一連の キャラクタからなる。これは、マークアップまたはキャラクタデータを表わす場合がある。 キャラクタ (character) は、ISO/IEC 10646 [ISO/IEC 10646] によって規定されている、テキストの基本単位である。合法なキャラクタは、タブ、キャリッジリターン、ラインフィードと、Unicodeおよび ISO/IEC 10646 の合法なグラフィックキャラクタである。[Unicode] の section 6.8 に定義されている "compatibility characters" の使用はしないように勧められる。

キャラクタの範囲
[2]  Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* 任意の Unicode キャラクタ。サロゲートブロック (surrogate block) と、FFFE、FFFF を除く。*/

キャラクタコードをビットパターンにエンコードするための機構は、実体ごとに異なっていてもよい。XMLプロセッサはすべて、10646 の UTF-8 と UFT-16 を受け付けなくてはならない。この2つのうちのどちらが使われているかを知らせ、あるいは他のエンコーディングを持ち込んで使用するための機構は、"4.3.3 実体内のキャラクタエンコーディング" において後述する。

2.3 共通の文法規則的構造

この節は、文法規則において広く用いられている記号をいくつか定義する。

S (空白.white space)は、1個以上のスペース (#x20) キャラクタ、キャリッジリターン、ラインフィード、タブからなる。

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

便宜上、キャラクタは、文字 (letter)、数字 (digit)、その他のキャラクタに分類される。文字は、1個以上の組み合わせキャラクタ (combining character) が続く場合のあるアルファベット (alphabetic character) や音節基礎キャラクタ (syllabic base character)、あるいは表意キャラクタ (ideographic character) からなる。それぞれのクラスの具体的なキャラクタの定義は、"B. キャラクタクラス" に与えられている。

Name は、1つの文字または数個の句読点 (punctuation) キャラクタのうちの1つで始まり、文字、数字、ハイフン、アンダースコア、コロン、ピリオドが続いたトークンである。"xml" という文字列や、(('X'|'x') ('M'|'m') ('L'|'l')) に合致する任意の文字列で始まる名前は、この仕様書のこのバージョンまたは将来のバージョンにおける標準化のために予約される。

注意: XML名前内部のコロンキャラクタは、名前スペースを用いた実験のために予約される。コロンの意味は将来のある時点で標準化されるものと期待されており、その時点には実験的目的のためにコロンを使っている文書は更新される必要があるかもしれない。(XMLのために採用される名前スペース機構が、実際に名前スペース区切り子としてコロンを使うということの保証はない。) 実際上、このことは、作成者は名前スペースの実験の一部として以外にXML名前の中でコロンを使うべきではないが、XMLプロセッサはコロンを名前キャラクタとして受け付けるべきだということを意味する。

Nmtoken(名前トークン)は、名前キャラクタの任意の混合物である。

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

リテラルデータは、その文字列の区切り子として使われている引用符を含まない、引用符で括られた任意の文字列である。リテラルは、内部実体 (internal entity) の内容 (EntityValue)、属性の値 (AttValue)、外部識別子 (SystemLiteral) の内容を規定するために使われる。SystemLiteral はマークアップをスキャンせずに解析できることに注意すること。

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

2.4 キャラクタデータ、マークアップ

テキストは、入り交じったキャラクタデータとマークアップからなる。 マークアップ (markup) は、 開始タグ (start-tag)終了タグ (end-tag)空要素タグ (empty-element tag)実体参照 (entity reference)キャラクタ参照 (character reference)注釈 (comment)CDATA 部 (CDATA section) 区切り子 (delimiter)、 文書型宣言 (document type declaration)処理命令 (processing instruction) という形を取る。

マークアップでないすべてのテキストは、文書のキャラクタデータ (character data) を構成する。

アンパサンドキャラクタ (&) と小なり不等号 (<) がリテラル形式で現れてよいのは、 マークアップ区切り子として使われるとき、または注釈処理命令CDATA 部の内部にあるときだけである。これらは内部実体宣言のリテラル実体値の内部でも合法である。"4.3.2 Well-Formed Parsed Entities" を見ること。それ以外の場所で必要であるならば、 数的キャラクタ参照 (numeric character references) か、それぞれ "&amp;"、"&lt;" という文字列を使ってエスケープされなければならない。大なり不等号 (>) は、"&gt;" という文字列を使って表わされてもよく、また、それが内容中の "]]>" という文字列の中で現れるとき、その文字列が CDATA 部の末尾をマークしていないときは、互換性のため、"&gt;" またはキャラクタ参照を使ってエスケープされなければならない。

要素の内容の中では、キャラクタデータとは、どのマークアップの開始区切り子も包含しない任意のキャラクタ文字列である。CDATA 部の中では、キャラクタデータとは、CDATA 部終了区切り子 "]]>" を含まない任意のキャラクタ文字列である。

属性値が単引用符と二重引用符の両方を包含できるようにするため、アポストロフィまたは単引用符キャラクタ (') は "&apos;" と表わしてよく、二重引用符キャラクタ (") は "&quot;" と表わしてよい。

キャラクタデータ
[14]  CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*)

2.5 注釈

注釈 (comment) は、他のマークアップの外側ならば文書内のどこに現れてもよい。さらに、文法によって認められている場所ならば、文書型宣言の内部に現れてもよい。注釈は、文書のキャラクタデータの一部分ではない。XMLプロセッサは、アプリケーションがコメントのテキストを引きだすことを可能にしてもよいが、可能にする必要はない。互換性のため、"--" という文字列(ダブルハイフン)は、注釈の内部で発生してはならない。

注釈
[15]  Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'

注釈の例

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

2.6 処理命令

処理命令 (processing instruction, PI) は、文書がアプリケーションのための命令を包含できるようにする。

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

処理命令は、文書のキャラクタデータの一部ではないが、アプリケーションにそのまま渡されなくてはならない。処理命令は、命令が向けられている先のアプリケーションを識別するために使われるターゲット (PITarget) で始まる。"XML" や "xml" などのターゲット名は、この仕様書のこのバージョンまたは将来のバージョンにおける標準化のために予約されている。XML表記機構 (the XML Notation mechanism) は、PIターゲットの形式的宣言のために使ってもよい。

2.7 CDATA 部

CDATA 部 (CDATA section) は、キャラクタデータが発生してよい場所ならばどこで発生してもよい。CDATA 部は、さもなくばマークアップとして認識されるキャラクタを包含するテキストのブロックをエスケープするために使われる。CDATA 部は "<![CDATA[" という文字列で始まり、"]]>" という文字列で終わる。

CDATA 部
[18]  CDSect ::= CDStart CData CDEnd
[19]  CDStart ::= '<![CDATA['
[20]  CData ::= (Char* - (Char* ']]>' Char*))
[21]  CDEnd ::= ']]>'

CDATA 部の内部では、CDEnd 文字列だけがマークアップとして認識されるから、小なり不等号やアンパサンドはリテラル形式で発生してもよい。これらは "&lt;" や "&amp;" を使ってエスケープする必要はない(し、エスケープできない)。CDATA 部はネストできない。

CDATA 部の例。ここでは "<greeting>" や "</greeting>" はマークアップではなくキャラクタデータとして認識される。

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

2.8 前書き、文書型宣言

XML文書は、使われているXMLのバージョンを指定するXML宣言 (XML declaration) で始まってよく、また始まるべきである。たとえば、下記は完全なXML文書であり整形式であるが、妥当ではない。

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

また、これもそうである。

<greeting>Hello, world!</greeting>

この仕様書のこのバージョンへの適合性を示すためには "1.0" というバージョン番号が使われるべきである。文書がこの仕様書のこのバージョンに適合しないならば、"1.0" という値を使うことはエラーである。この仕様書の今後のバージョンに "1.0" 以外の番号を与えることがXMLワーキンググループの意図ではあるが、この意図は、将来のバージョンの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 ::= CommentPIS

XML文書型宣言は、文書のクラスに文法を提供するマークアップ宣言を包含し、またはそれを指し示す。この文法は文書型定義またはDTDとして知られている。文書型宣言は、外部サブセット(特殊な種類の外部実体)を指し示し、あるいは内部サブセットの中に直接にマークアップ宣言を包含することができ、その両方をすることもできる。文書のためのDTDは、両方のサブセットを一つにまとめたものからなる。

マークアップ宣言は、 要素型宣言 (element type declaration) か、 属性リスト宣言(attribute-list declaration)実体宣言(entity declaration)表記宣言(notation declaration) である。これらの宣言は、下記の整形式性制約および妥当性制約に記述されているように、全部または一部がパラメータ実体の内部に包含される。より完全な情報は "4. 物理的構造" を見ること。

文書型宣言
[28]  doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('[' (markupdeclPEReferenceS)* ']' S?)? '>' [ VC: ルート要素型 ]
[29]  markupdecl ::= elementdeclAttlistDeclEntityDeclNotationDeclPIComment [ VC: 適切な宣言/PEのネスト ]
[ WFC: 内部サブセット内のPE ]

マークアップ宣言は、全部または一部がパラメータ実体置換テキストからなる場合がある。この仕様書内の個別の中間生成規則(non-terminal. elementdeclAttlistDecl など)を表わす後出の生成規則は、パラメータ実体がすべて取り込まれた後で宣言を記述する。

妥当性制約: ルート要素型
文書型宣言の中の Name は、ルート要素の要素型に合致しなければならない。

妥当性制約: 適切な宣言/PEのネスト
パラメータ実体置換テキストは、マークアップ宣言を用いて適切にネストされなければならない。すなわち、マークアップ宣言(上記の markupdecl)の最初のキャラクタと最後のキャラクタとの一方がパラメータ実体参照の置換テキストの中に包含されていれば、 両方とも同じ置換テキストに包含されていなければならない。

整形式性制約: 内部サブセット内のPE
内部DTDサブセットの中では、パラメータ実体参照は、マークアップ宣言の内部ではなく、マークアップ宣言が発生できる場所でしか発生できない。(これは、外部パラメータ実体の中で発生する参照や、外部サブセットには適用されない。)

内部サブセットのように、外部サブセットや、DTD内で参照されている外部パラメータ実体は、 中間生成規則記号 markupdecl によって認められた型の完全なマークアップ宣言に空白やパラメータ実体参照が混じったものの連なりで構成されていなければならない。しかしながら、外部サブセットまたは外部パラメータ実体の内容は、条件的セクション (conditional section) 構造を使うことにより、条件によって無視される場合がある。これは内部サブセットの中では認められない。

外部サブセット
]
[30]  extSubset ::= TextDecl? extSubsetDecl
[31]  extSubsetDecl ::= (markupdeclconditionalSectPEReferenceS )*

外部サブセットや外部パラメータ実体は、その中ではマークアップ宣言のだけでなくマークアップ宣言の内部ででもパラメータ実体参照が許されるという点でも、内部サブセットと異なる。

文書型宣言のあるXML文書の例

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

文書のDTDのURIはシステム識別子 (system identifier) "hello.dtd" が与える。

この例のように、宣言はローカルに与えることもできる。

<?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') "'") | ('"' ('yes' | 'no') '"')) [ VC: スタンドアローン文書宣言 ]

スタンドアローン文書宣言の中では、"yes" という値は、XMLプロセッサからアプリケーションへ渡される情報に影響する文書実体にとって外部的なマークアップ宣言が (DTD外部サブセット内か、内部サブセットから参照される外部パラメータ実体内かのいずれかに)ないことを示す。"no" という値は、そうした外部マークアップ宣言があり、またはあるかもしれないことを示す。スタンドアローン文書宣言は外部宣言の存在を示すだけであることに注意すること。外部実体が内部的に宣言されるとき、そうした実体への参照が文書内に存在しても、文書のスタンドアローン状態を変化させない。

外部マークアップ宣言がなければ、スタンドアローン文書宣言は無意味である。外部マークアップ宣言があり、スタンドアローン文書宣言がなければ、"no" という値があるものとされる。

standalone="no" が当てはまるXML文書は、アルゴリズム的にスタンドアローン文書に変換できる。スタンドアローン文書は、いくつかのネットワーク配信アプリケーションにとって望ましい場合がある。

妥当性制約: スタンドアローン文書宣言
外部マークアップ宣言のどれかが、

の宣言を包含するならば、スタンドアローン文書宣言は "no" という値をもたなければならない。

スタンドアローン文書宣言をもつXML宣言の例

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

2.10 空白の扱い

XML文書の編集において、マークアップを離して置いて読みやすくするために 「空白 (white space)」(スペース、タブ、改行.この仕様書内では中間生成規則 S によって示されている)を使うことが便利であることがよくある。そうした空白は大概、文書の配信版の中に組み込まれることは意図されていない。他方、たとえば詩歌やソースコードなどにおいては、配信版でも保存されるべき「重要な」空白が一般的である。

XMLプロセッサは、マークアップでない文書中のすべてのキャラクタを、つねにそのままアプリケーションへ渡さなければならない。妥当性を検証するXMLプロセッサは、これらのキャラクタのどれが要素内容内に現れている空白を構成するかもアプリケーションに知らせなくてはならない。

その要素の中で空白がアプリケーションによって保存されるべきとの意図を知らせるために、xml:space という名前の特殊な属性を要素に添付してもよい。妥当な文書では、他と同様に、この属性が使われるならば宣言されなければならない。宣言されるときには、取りうる値が "default" と "preserve" だけの 列挙された型 (enumerated type) として与えられなくてはならない。例.

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

"default" という値は、アプリケーションのデフォルトの空白処理モードがこの要素にとって受付可能であることを知らせる。"preserve" という値は、アプリケーションが空白をすべて保存することの意図を示す。この宣言された意図は、xml:space 属性の他のインスタンスで上書きされない限り、それが指定されている要素の内容の内部にある要素すべてに適用されるものとみなされる。

どの文書のルート要素も、この属性の値が与えられるか、または属性がデフォルト値で宣言されるかしない限り、アプリケーション空白処理に関して何の意図も知らせなかったものとみなされる。

2.11 行末の処理

XML解析される実体は、編集の便宜上複数行に組織されたコンピュータファイルに保存されることがよくある。これらの行は、概して、キャリッジリターン (#xD) とラインフィード (#xA) のキャラクタの組み合わせによって分離される。

アプリケーションの仕事を単純化するため、 解析される外部実体、または解析される内部実体のリテラル実体値が、"#xD#xA" というリテラルな2キャラクタの列か、孤立したリテラルな #xD かを包含する場所ならばどこであっても、 XMLプロセッサはアプリケーションに #xA という単一のキャラクタを渡さなければならない。(この挙動は、解析前、入力時に改行すべてを #xA に標準化することにより、簡便に生み出すことができる。)

2.12 言語の識別

文書処理において、内容を書いている自然的または形式的言語を識別することが便利なことがよくある。XML文書内の任意の要素の内容や属性値で使われている言語を指定するために、xml:lang という名前の特殊な属性を文書に挿入してもよい。妥当な文書では、他と同様に、この属性が使われるのであれば 宣言されなければならない。属性の値は [IETF RFC 1766], "Tags for the Identification of Languages" で定義されている言語識別子である。

言語の識別
[33]  LanguageID ::= Langcode ('-' Subcode)*
[34]  Langcode ::= ISO639CodeIanaCodeUserCode
[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 セグメントは何個あってもよい。もし最初のサブコードセグメントが存在し、その Subcode が2文字からなるのであれば、[ISO 3166], "Codes for the representation of names of countries" による国別コードでなくてはならない。最初のサブコードが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・'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'>

3. 論理的構造

XML文書は 1つ以上の要素 (element) を包含し、この要素の境界は開始タグ (start-tag)終了タグ (end-tag) によって、 あるいは要素については空要素タグ (empty-element tag) によって区切られている。要素はそれぞれ、ときにその「一般的識別子 (generic identifier. GI)」と呼ばれる名前によって識別される型 (type) をもち、また1セットの属性指定をもつ場合もある。属性指定はそれぞれ1つの名前 (name) と1つの 値 (value) をもつ。

要素
[39]  element ::= EmptyElemTag
STag content ETag [ WFC: 要素型の合致 ]
[ VC: 要素の妥当性 ]

この仕様書は、要素型および属性の意味や使用法、(文法論を超えた)命名法を包含しない。ただし、(('X'|'x')('M'|'m')('L'|'l')) と合致するもので始まる名前は、この仕様書のこのバージョンまたは将来のバージョンにおける標準化のために予約される。

整形式性制約: 要素型の合致
要素の終了タグの Name は、開始タグの要素型と合致しなければならない。

妥当性制約: 要素の妥当性
要素は、Name が要素型と合致する elementdecl に合致する宣言があり、以下の1つが当てはまるならば、妥当である。

  1. 宣言が EMPTY に合致し、要素が内容をもたない。
  2. 宣言が children に合致し、 子要素の連なりが、子要素の各対の間に任意的な空白(中間生成規則 S に合致するキャラクタ)がある内容モデルの中の正規の表現によって生成された言語に属する。
  3. 宣言が Mixed に合致し、内容が、その型が内容モデル内の名前に合致するキャラクタデータ子要素とからなる。
  4. 宣言がどれかに合致し、どの子要素の型も宣言されている。

3.1 開始タグ、終了タグ、空要素タグ

空でないXML要素の最初は開始タグ (start-tag) でマークされる。

開始タグ
[40]  STag ::= '<' Name (S Attribute)* S? '>' [ WFC: 属性指定の一意性 ]
[41]  Attribute ::= Name Eq AttValue [ VC: 属性値の型 ]
[ WFC: 外部実体への参照の禁止 ]
[ WFC: 属性値内の < の禁止 ]

開始タグおよび終了タグの Name は要素の型 (type) を与える。 Name-AttValue の対は、要素の属性指定 (attribute specification) という。 それぞれの対の Name属性名 (attribute name) といい、 AttValue の内容(' または " 区切り子の間のテキスト)は属性値 (attribute value) という。

整形式性制約: 属性指定の一意性
同じ開始タグまたは空要素タグの中に2回以上現れてよい属性名はない。

妥当性制約: 属性値の型
属性は宣言されていなければならない。値は、その属性について宣言された型のものでなくてはならない。(属性型については、"3.3 属性リスト宣言" を見ること。)

整形式性制約: 外部実体参照の禁止
属性値は、外部実体への直接または間接の実体参照を包含することができない。

整形式性制約: 属性値内の < の禁止
("&lt;" 以外の)属性値の中で直接または間接に参照されている実体の置換テキストは、< を包含してはならない。

開始タグの例

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

開始タグで始まる要素の最後は、開始タグで与えられた要素型をエコーする名前を包含している 終了タグ (end-tag) によってマークされなくてはならない。

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

終了タグの例

</termdef>

開始タグと終了タグの間のテキストは、要素の内容 (content) と呼ばれる。

要素の内容
[43]  content ::= (elementCharDataReferenceCDSectPIComment)*

要素が空 (empty) であれば、要素は、開始タグの直後に終了タグを続けたもの、または空要素タグによって表現されなければならない。 空要素タグ (empty-element tag) は特別な形をとる。

空要素用のタグ
[44]  EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' [ WFC: 属性指定の一意性 ]

空要素タグは、EMPTY というキーワードを使って定義されているか否かを問わず、内容をもたない任意の要素を表わすために使ってよい。相互運用性のためEMPTY宣言されている要素については空要素タグを使わなくてはならず、また空要素タグを使うことができるのはその要素についてのみである。

空要素の例

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

3.2 要素型宣言

XML文書要素構造は、解析の目的のために、要素型宣言と属性リスト宣言を使って制約してもよい。要素型宣言は、要素の内容を制約するものである。

要素型宣言は、しばしば、どの要素型が要素のとして現れることができるかを制約する。ユーザの選択により、XMLプロセッサは、ある宣言が、宣言を与えられていない要素型に言及するときには警告を発行してもよいが、これはエラーではない。

要素型宣言 (element type declaration) は、このような形をとる。

要素型宣言
[45]  elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>' [ VC: 要素型宣言の一意性 ]
[46]  contentspec ::= 'EMPTY' | 'ANY' | Mixedchildren

ここでは Name は、宣言されている要素型を与える。

妥当性制約: 要素型宣言の一意性
2度以上宣言してよい要素型はない。

要素型宣言の例

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

3.2.1 要素の内容

その要素の要素が、 任意的に空白(中間生成規則 S に合致するキャラクタ)で分離された要素だけを含まなくてはならない(キャラクタデータは含んではならない)とき、 その要素型は要素内容 (element content) をもつ。この場合、制約は、内容モデル、すなわち、子要素の許容される型とそれらが出現を許される順序とを支配する単純な文法を取り込む。文法は内容パーティクル (cp) に基づいて構築される。内容パーティクルは、名前および内容パーティクルの選択リスト、内容パーティクルの順列リストからなる。

要素内容モデル
[47]  children ::= (choiceseq) ('?' | '*' | '+')?
[48]  cp ::= (Namechoiceseq) ('?' | '*' | '+')?
[49]  choice ::= '(' S? cp ( S? '|' S? cp )* S? ')' [ VC: グループ/PEの適切なネスト ]
[50]  seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' [ VC: グループ/PEの適切なネスト ]

ここでは各 Name は、として現れてよい要素の型である。選択リスト内にある内容パーティクルは、文法中で選択リストが現れる位置の要素内容の中に現れてよい。順列リスト内に発生する内容パーティクルは各自、リスト内に与えられた順序で要素内容の中に現れなくてはならない。名前やリストに続いている任意的なキャラクタは、その要素やそのリスト内の内容パーティクルが、1回以上 (+)、0回以上 (*)、0回または1回 (?) 現れてよいか否かを支配する。そうした演算子が存在しないのは、要素や内容パーティクルがちょうど1回現れなくてはならないという意味である。この文法と意味はこの仕様書の生成規則で使われているものと同じである。

要素の内容は、順列、選択、繰り返し演算子に従って、内容の中の各要素を内容モデル内の要素型と照合し、内容モデルを通じてパスを追跡できる場合には、またできる場合にのみ、内容モデルに合致する。互換性のため、文書内の要素が内容モデル内の1つの要素型の1回の出現を超えて合致できるならば、エラーである。さらなる情報は、"E. 決定的内容モデル" を見ること。

妥当性制約: グループ/PEの適切なネスト
パラメータ実体置換テキストは、括弧で括られたグループを用いて適切にネストされなければならない。すなわち、choiceseqMixed 構造の中の左括弧または右括弧のどちらかが パラメータ実体の置換テキストに包含されるならば、両方とも同じ置換テキストに包含されなければならないのである。相互運用性のためchoiceseqMixed 構造の中にパラメータ実体参照が現れるならば、 その置換テキストは空であるべきではなく、また置換テキストの最初の非ブランクキャラクタも最後の非ブランクキャラクタもコネクタ(| または ,)であるべきではない。

要素内容モデルの例

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

3.2.2 混在内容

その型の要素が、任意的に要素が混じったキャラクタデータを包含してよいとき、要素混在内容 (mixed content) をもつ。この場合、子要素の型は制約されることがあるが、その順序や出現数は制約されない。

混在内容宣言
[51]  Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*'
| '(' S? '#PCDATA' S? ')' [ VC: グループ/PEの適切なネスト ]
[ VC: 型の重複の禁止 ]

ここでは Name は、子として現れてよい要素の型を与える。

妥当性制約: 型の重複の禁止
単一の混在内容宣言の中に同じ名前は2度以上現れてはならない。

混在内容宣言の例

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

3.3 属性リスト宣言

属性 (attribute) は、名前-値の対を要素に結びつけるために使われる。属性指定が現れてよいのは、開始タグ空要素タグの内部だけである。したがって、それらを認識するために使われる生成規則は "3.1 開始タグ、終了タグ、空要素タグ" にある。属性リスト宣言は、

ために使ってよい。

属性リスト宣言 (attribute-list declaration) は、与えられた要素型と結び付けられる各属性の名前、データ型、(あれば)デフォルト値を指定する。

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

AttlistDecl 規則の Name は、要素の型である。ユーザの選択により、それ自身が宣言されていない要素型のために属性が宣言されれていれば、XMLプロセッサは警告を発行してもよいが、これはエラーではない。AttDef 規則の Name は属性の名前である。

与えられた要素型に2つ以上の AttlistDecl が与えられているとき、与えられたすべてのものの内容が併合される。与えられた要素型の同じ属性に2つ以上の定義が与えられているときは、最初の宣言が拘束的であり、後の宣言は無視される。相互運用性のため、DTDのライターは、与えられた要素型について最大で1つの属性リスト宣言を、与えられた属性名について最大で1つの属性定義を、各属性宣言には少なくとも1つの属性定義を与えることを選んでもよい。相互運用性のため、ユーザの選択で、XMLプロセッサは与えられた要素型について2つ以上の属性リスト宣言が与えられ、あるいは与えられて属性に2つ以上の属性定義が与えられているときに警告を発行してもよいが、 これはエラーではない。

3.3.1 属性型

XML属性型は3種類、文字列型、トークン型のセット、列挙型である。文字列型は、任意のリテラル文字列を値としてとってよい。トークン化型は、注記されているように、変動する辞書的および意味的制約をもつ。

属性型
[54]  AttType ::= StringTypeTokenizedTypeEnumeratedType
[55]  StringType ::= 'CDATA'
[56]  TokenizedType ::= 'ID' [ VC: ID ]
[ VC: 1要素1ID ]
[ VC: ID属性デフォルト ]
| 'IDREF' [ VC: IDREF ]
| 'IDREFS' [ VC: IDREF ]
| 'ENTITY' [ VC: 実体名 ]
| 'ENTITIES' [ VC: 実体名 ]
| 'NMTOKEN' [ VC: 名前トークン ]
| 'NMTOKENS' [ VC: 名前トークン ]

妥当性制約: ID
ID 型の値は Name 生成規則に合致しなければならない。1つの名前がXML文書内に2回以上この型の値として現れてはならない。すなわち、ID値は、それをもつ要素を一意的に識別しなければならないのである。

妥当性制約: 1要素1ID
2つ以上の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 に合致しなければならない。

列挙属性 (enumerated attribute) は、宣言の中で与えられた値のリストの1つをとることができる。列挙型には2つの種類がある。

列挙属性型
[57]  EnumeratedType ::= NotationTypeEnumeration
[58]  NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' [ VC: 表記法属性 ]
[59]  Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' [ VC: 列挙 ]

NOTATION 属性は、関係づけられたシステム識別子および/またはパブリック識別子を用いてDTDで宣言され、 その属性が添付される要素を解釈するときに使われるべき 表記法 (notation) を識別する。

妥当性制約: 表記法属性
この型の値は、宣言に取り込まれている表記法の名前の1つに合致しなければならない。宣言内のすべての表記法名は宣言されなくてはならない。

妥当性制約: 列挙
この型の値は、宣言内の Nmtoken トークンの1つに合致しなければならない。

相互運用性のため、単一の要素型の列挙属性型の中で同じ Nmtoken は2度以上発生するべきではない。

3.3.2 属性デフォルト

属性宣言は、その属性の存在が必須であるか否か、必須でない場合には宣言された属性が文書内にないときにXMLプロセッサがどのように反応すべきかについての情報を与える。

属性デフォルト
[60]  DefaultDecl ::= '#REQUIRED' | '#IMPLIED'
| (('#FIXED' S)? AttValue) [ VC: 必須属性 ]
[ VC: 属性デフォルトの合法性 ]
[ WFC: 属性値内の < の禁止 ]
[ VC: 固定属性デフォルト ]

属性宣言において、#REQUIRED はその属性がつねに与えられなければならないことを意味し、#IMPLIED はデフォルト値が与えられないことを意味する。 宣言が #REQUIRED でも #IMPLIED でもないならば、AttValue 値は宣言されたデフォルト (default) 値を包含する。#FIXED というキーワードは、属性がつねにデフォルト値をもたなくてはならないことを宣明する。デフォルト値が宣言されていれば、XMLプロセッサが省略された属性に遭遇したとき、プロセッサはその属性が宣言されたデフォルト値つきで存在するかのように動作することになる。

妥当性制約: 必須属性
デフォルト宣言が #REQUIRED というキーワードならば、属性リスト宣言内の型のすべての要素に属性が指定されなければならない。

妥当性制約: 属性デフォルトの合法性
宣言されたデフォルト値は、宣言された属性型の辞書的制約に沿わなければならない。

妥当性制約: 固定属性デフォルト
属性が #FIXED キーワードで宣言されたデフォルト値をもつならば、その属性の具体値(インスタンス)はデフォルト値に合致しなければならない。

属性リスト宣言の例

<!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 でなければ、XMLプロセッサは、先頭または末尾についているスペース (#x20) キャラクタを切り捨てて スペース (#x20) キャラクタの並びを単一のスペース (#x20) キャラクタで置き換えることにより標準化された属性値をさらに処理しなければならない。

宣言が読まれていない属性はすべて、妥当性を検証しないパーサにより、それが CDATA であるかのように扱われるべきである。

3.4 条件的セクション

条件的セクション (conditional section) は、それらを支配するキーワードに基づいてDTDの論理的構造に取り込まれあるいは排除される文書型宣言外部サブセットの一部分である。

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

内部および外部DTDサブセットのように、条件的セクションは、1つ以上の完全な宣言、注釈、処理命令、ネストされた条件的セクションに空白が混じったものを包含してよい。

条件的セクションのキーワードが INCLUDE であれば、条件的セクションの内容はDTDの一部である。条件的セクションのキーワードが IGNORE であれば、条件的セクションの内容は、論理的にはDTDの一部ではない。信頼できる解析のためには、ネストされた条件セクションを探知して最も外側の(無視される)条件的セクションの末尾が適切に探知されることを保証するため、無視される条件的セクションであっても内容が読まれなければならないことに注意すること。INCLUDE のキーワードがついた条件的セクションが IGNORE のキーワードがついたより大きな条件的セクションの内部で発生するならば、条件的セクションは外側のものも内側のものも両方とも無視される。

条件的セクションのキーワードがパラメータ実体参照であれば、パラメータ実体は、プロセッサがその条件的セクションを取り込むか無視するかを決定する前にその内容によって置換されなければならない。

例.

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

4. 物理的構造

XML文書は、1つまたは多数の記憶単位からなっていてもよい。これらは実体 (entity) と呼ばれる。実体はすべて内容 (content> を有し、(下記の通り文書実体と外部DTDサブセットを除き)すべて名前 (name) で識別される。XML文書はそれぞれ、文書実体 (document entity) と呼ばれる実体を1つ有する。この文書実体は、XMLプロセッサにとっての出発点として働くものであり、文書全体を包含してもよい。

実体は、解析されるものでも解析されないものでもよい。 解析される実体の内容はその置換テキストとして参照される。このテキストは文書の統合的部分とみなされる。

解析されない実体は、内容がテキストであってもなくてもよく、テキストであってもXMLでなくてよいリソースである。解析されない実体は各自、結び付けられた表記法 (notation) を有し、名前で識別される。XMLプロセッサが実体の識別子と表記法をアプリケーションに利用可能にするという要求を超えては、XMLは解析されない実体の内容に制約を課さない。

解析される実体は、実体参照を用いて、名前で呼び出される。解析されない実体は名前で呼び出されるが、この名前は ENTITY 属性または ENTITIES 属性の値の中で与えられる。

一般的実体 (general entity) は、文書内容の内部で使うための実体である。この仕様書では、あいまいさを導かないときには、一般的実体はときに実体という無限定の用語で呼ばれることがある。 パラメータ実体は、DTD内部で使うための解析される実体である。これら2タイプの実体は、異なる参照形式を使い、異なる文脈において認識される。それだけではなく、これらは異なる名前スペースを占める。同じ名前をもつパラメータ実体と一般的実体とは、2つの区別される実体である。

4.1 キャラクタ参照、実体参照

キャラクタ参照 (character reference) は、ISO/IEC 10646 キャラクタセットの特定のキャラクタ、たとえば利用可能な入力デバイスから直接にアクセスできないキャラクタを参照する。

キャラクタ参照
[66]  CharRef ::= '&#' [0-9]+ ';'
| '&#x' [0-9a-fA-F]+ ';' [ WFC: キャラクタの合法性 ]

整形式性制約: キャラクタの合法性
キャラクタ参照を使って参照されているキャラクタは Char を表わす生成規則に合致しなければならない。

キャラクタ参照が "&#x" で始まるならば、終端 ; までの数字および文字は ISO/IEC 10646 におけるキャラクタコードの16進表記を与える。単に "&#" で始まるならば、終端 ; までの数字はキャラクタコードの10進表記を与える。

実体参照 (entity reference) は、指名された実体 (named entity) の内容を参照する。 一般的解析される実体への参照は、区切り子としてアンパサンド (&) とセミコロン (;) を使う。 パラメータ実体参照 (parameter-entity reference) は、区切りとしてパーセント記号 (%) とセミコロン (;) を使う。

実体参照
[67]  Reference ::= EntityRefCharRef
[68]  EntityRef ::= '&' Name ';' [ WFC: 実体の宣言 ]
[ VC: 実体の制限 ]
[ WFC: 解析される実体 ]
[ WFC: 再帰の禁止 ]
[69]  PEReference ::= '%' Name ';' [ VC: 実体の宣言 ]
[ WFC: 再帰の禁止 ]
[ WFC: DTD内 ]

整形式性制約: 実体の宣言
DTDのない文書や、パラメータ実体参照を包含しない内部DTDサブセットだけしかない文書、"standalone='yes'" の文書においては、 実体参照において与えられている Name実体宣言の中のものと合致しなければならない。ただし、整形式文書は、以下の実体は宣言する必要はない。amp, lt, gt, apos, quot. パラメータ実体の宣言は、それに対する参照のどれよりも先行しなければならない。同様に、一般的実体の宣言は、属性リスト宣言内のデフォルト値で現れる、それに対するどの参照よりも先行しなければならない。実体が外部サブセットや外部パラメータ実体の中で宣言されていれば、妥当性を検証しないプロセッサはそれらの宣言を読んで処理することを義務づけられないことに注意すること。そうした文書については、実体は宣言されなくてはならないという規則は standalone='yes' である場合に限って整形式性制約となる。

妥当性制約: 実体の宣言
"standalone='no'" のある外部サブセットまたは外部パラメータ実体を有する文書においては、実体参照内で与えられる Name実体宣言の中のものと合致しなければならない。相互運用性のため、妥当な文書は、amp, lt, gt, apos, quot という実体を "4.6 定義済み実体" において規定される形式で宣言するべきである。パラメータ実体の宣言は、それに対する参照のどれにも先行しなければならない。同様に、一般的実体の宣言は、属性リスト宣言の中のデフォルト値の中に現れる、それに対する参照のどれにも先行しなければならない。

整形式性制約: 解析済み実体
実体参照は 解析されない実体の名前を包含してはならない。解析されない実体が参照されてもよいのは ENTITY 型または ENTITIES 型として宣言された属性値の中だけである。

整形式性制約: 再帰の禁止
解析される実体は、直接間接を問わずそれ自身への再帰的参照を包含してはならない。

整形式性制約: DTD内
パラメータ実体参照が現れてよいのはDTDの中だけである。

キャラクタ参照、実体参照の例

T ype <key>less-than</key> (&#x3C;) 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;

4.2 実体宣言

実体は、このように宣言される。

実体宣言
[70]  EntityDecl ::= GEDeclPEDecl
[71]  GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>'
[72]  PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>'
[73]  EntityDef ::= EntityValue | (ExternalID NDataDecl?)
[74]  PEDef ::= EntityValueExternalID

Name は、実体参照の中の実体、 あるいは解析されない実体の場合には ENTITY 属性または ENTITIES 属性の値の中の実体を識別する。同じ実体が2回以上宣言されていれば、最初の宣言が拘束的である。ユーザの選択により、実体が複数回宣言されていればXMLプロセッサは警告を発行してもよい。

4.2.1 内部実体

実体宣言が EntityValue であれば、宣言された実体は内部実体 (internal entity) と呼ばれる。分離した物理的記憶オブジェクトはなく、実体の内容は宣言の中で与えられる。リテラル実体値で表わされた実体やキャラクタ参照の中には、正しい置換テキストを生み出すことが要求される場合があるものがある。"4.5 内部実体置換テキストの構造" を見ること。

内部実体は解析される実体である。

内部実体宣言の例

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

4.2.2 外部実体

実体は、内部的でなければ、外部実体 (external entity) であり、以下のように宣言される。

外部実体宣言
[75]  ExternalID ::= 'SYSTEM' S SystemLiteral
| 'PUBLIC' S PubidLiteral S SystemLiteral
[76]  NDataDecl ::= S 'NDATA' S Name [ VC: 表記法の宣言 ]

NDataDecl があれば、これは一般的な解析されない実体である。それ以外の場合は解析される実体である。

妥当性制約: 表記法の宣言
Name表記法の宣言された名前に合致しなければならない。

SystemLiteral は実体のシステム識別子 (system identifier) と呼ばれる。これはURIであり、実体を引き出すために使われる場合がある。よくURIと一緒に使われるハッシュマーク (#) やフラグメント識別子は、形式的にはURIそのものではないことに注意すること。フラグメント識別子がシステム識別子の一部として与えられていれば、XMLプロセッサはエラーを発信してもよい。この仕様書の外部にある情報(例.特定のDTDによって定義されている特殊なXML要素型や、特定のアプリケーションの仕様によって定義されている処理命令)によって別段与えられているのでない限り、 相対URIは、実体宣言があるリソースの位置との相対比較である。したがって、URIは、文書実体外部DTDサブセットを包含している実体、 あるいはその他の外部パラメータ実体との相対比較である。

XMLプロセッサは、UTF-8 を用いてURI内の非 ASCII キャラクタを1バイトまたはそれ以上のバイトとして表現し、これらのバイトをURIエスケープ機構を用いてエスケープすることにより (すなわち、各バイトを %HH に変形することにより。ここで HH はバイト値の16進表記である)扱うべきである。

システム識別子に加えて、外部識別子はパブリック識別子 (public identifier) を取り込んでもよい。実体の内容を引き出そうと試みるXMLプロセッサは、パブリック識別子を使って代替URIを生成しようとしてもよい。プロセッサがそのようにできないならば、システムリテラルで指定されている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 テキスト宣言

解析される外部実体はそれぞれ、テキスト宣言 (text declaration) で始まる場合がある。

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

テキスト宣言は、解析される実体への参照によってではなく、リテラルに与えられなければならない。解析される外部実体の最初以外の位置に現れてよいテキスト宣言はない。

4.3.2 整形式の解析される実体

文書実体は、document という名前の生成規則に合致すれば、整形式である。一般的解析される外部実体は、extParsedEnt という名前の生成規則に合致すれば、整形式である。外部パラメータ実体は、extPE という名前の生成規則に合致すれば、整形式である。

整形式の解析される外部実体
[78]  extParsedEnt ::= TextDecl? content
[79]  extPE ::= TextDecl? extSubsetDecl

一般的な解析される内部実体は、その置換テキストが content という名前の生成規則に合致すれば、整形式である。内部パラメータ実体は、定義により、すべて整形式である。

実体における整形式性の結果は、XML文書内の論理的および物理的構造が適切にネストされているということである。どの開始タグ終了タグ空要素タグ要素注釈処理命令キャラクタ参照実体参照も、ある実体の中で始まって他の実体の中で終わることはできない。

4.3.3 実体内のキャラクタエンコーディング

XML文書内の解析される外部実体は各自、キャラクタを表わすのに異なるエンコーディングを使ってもよい。XMLプロセッサはすべて UTF-8 または UTF-16 で書かれた実体を読むことができなければならない。

UTF-16 でエンコードされた実体は、ISO/IEC 10646 Annex E および Unicode Appendix B によって記述されているバイト順マーク (the Byte Order Mark. the ZERO WIDTH NO-BREAK SPACE charecter, #xFEFF) で始まらなければならない。これは、エンコーディング署名であって、XML文書のマークアップやキャラクタデータの一部分ではない。UTF-8 と UTF-16 でエンコードされた文書を区別するために、XMLプロセッサはこのキャラクタを使えなければならない。

XMLプロセッサは UTF-8 と UTF-16 エンコーディングで書かれた実体を読むことだけしか要求されないが、他のエンコーディングが世界中で使われていることが認識され、XMLプロセッサがそれらを使った実体を読むことが望ましい場合がある。UTF-8 または UTF-16 以外のエンコーディングで記録されている解析される実体は、エンコーディング宣言を包含するテキスト宣言 (text declaration) で始まらなければならない。

エンコーディング宣言
[80]  EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' |  "'" EncName "'" )
[81]  EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')* /* エンコーディング名は Latin キャラクタだけを含む */

文書実体において、エンコーディング宣言はXML宣言の一部である。EncName は使われているエンコーディングの名前である。

エンコーディング宣言においては、Unicode / ISO/IEC 10646 の様々なエンコーディングとを表わすためには "UTF-8", "UTF-16", "ISO-10646-UCS-2", "ISO-10646-UCS-4" という値が使われるべきであり、ISO 8850 の一部を表わすためには "ISO-8859-1", "ISO-8859-2", ... "ISO-8859-9" という値が使われるべきであり、JIS X-0208-1997 の様々なエンコードされた形式を表わすためには "Shift-JIS", "Shift_JIS", "EUC-JP" という値が使われるべきである。XMLプロセッサは他のエンコーディングを認識してもよい。IANA (the Internet Assigned Numbers Authority) [IANA] で、単にリストされているにすぎないもの以外の(charset として)登録されているキャラクタエンコーディングは、その登録されている名前を使って参照されるべきである。これらの登録された名前は大文字小文字の区別がないものとして定義されており、照合をしようとするプロセッサは大文字小文字を区別しない方法で照合をするべきであることに注意すること。

外部転送プロトコル(例.HTTP、MIME)によって与えられる情報がない場合、 エンコーディング宣言を取り込んでいる実体がその宣言で指名されている以外のエンコーディングでXMLプロセッサに提示されること、 エンコーディング宣言が外部実体の最初以外で発生すること、 バイト順マークでもエンコーディング宣言でも始まらない実体が UTF-8 以外のエンコーディングを使うことは、エラーである。ASCII は UTF-8 のサブセットであるから、通常の ASCII 実体はエンコーディング宣言を厳密に要求されないことに注意すること。

XMLプロセッサが処理できないエンコーディングをもつ実体に遭遇したときは、致命的エラーである。

エンコーディング宣言の例

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

4.4 XMLプロセッサの実体、参照の扱い

下記の表は、どのキャラクタ参照、実体参照、解析されない実体の呼び出しが出現するか、またそれぞれの場合にXMLプロセッサの要求される挙動をまとめたものである。左端の列の見出しは認識文脈を記述する。

内容の中にある参照
開始タグの後であり終了タグの前である任意の場所にある参照として。中間生成規則 content に対応する。
属性値の中の参照
開始タグの中にある属性の値、または属性宣言の中のデフォルト値かの内部にある参照として。中間生成規則 AttValue に対応する。
属性値として発生
参照ではなく Name として。ENTITY 型として宣言されている属性の値、またはENTITIES 型として宣言されている属性の値の中のスペースで区切られたトークンの1つとして出現する。
実体値の中の参照
実体宣言の中にあるパラメータまたは内部実体のリテラル実体値内部での参照として。中間生成規則 EntityValue に対応する。
DTDの中の参照
DTDの内部サブセットまたは外部サブセットの内部にあり EntityValueAttValue の外にある参照として。
実体型 キャラクタ
パラメータ 一般的内部 解析される一般的外部 解析されない
内容の中の参照 認識されない 取り込まれる 妥当性を検証するならば取り込まれる 禁止 取り込まれる
属性値の中の参照 認識されない リテラルに取り込まれる 禁止 禁止 取り込まれる
属性値として発生 認識されない 禁止 禁止 通知する 認識されない
実体値の中の参照 リテラルに取り込まれる バイパスされる バイパスされる 禁止 取り込まれる
DTDの中の参照 PEとして取り込まれる 禁止 禁止 禁止 禁止

4.4.1 認識されない

DTDの外部では % キャラクタは特別な意味をもたない。したがって、DTDの中でならばパラメータ実体参照となるはずのものが、内容の中ではマークアップとして認識されない。同様に、解析されない実体の名前は、それが適切に宣言された属性の値の中に現れる場合を除いて、認識されない。

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 % YN '"Yes"' >
<!ENTITY WhatHeSaid "He said &YN;" >

が、これは整形式でない。

<!ENTITY EndAttr "27'" >
<element attribute='a-&EndAttr;>

4.4.6 通知する

解析されない実体の名前が、ENTITY 型や ENTITIES 型として宣言されている属性の値の中のトークンとして現れるとき、 妥当性を検証するプロセッサは、実体と、その結び付けられた表記法の両方について、システム識別子と (あれば)パブリック識別子とをアプリケーションに知らせなければならない。

4.4.7 バイパスされる

一般的実体参照が

実体宣言内のEntityValue の中に現れるとき、一般的実体はバイパスされてそのまま残される。

4.4.8 PEとして取り込まれる

解析される外部実体と一緒のときには、パラメータ実体は妥当性を検証するならば取り込まれる必要があるにすぎない。パラメータ実体参照がDTDの中で認識されて取り込まれるとき、その置換テキストは、先頭に1つ、末尾に1つスペース (#x20) キャラクタを添付することにより拡大される。その意図は、パラメータ実体の置換テキストを、DTD内に整数個の文法的トークンを包含するように制約することである。

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

内部実体の扱いを論じるに際しては、実体値の2つの形態を区別することが有益である。 リテラル実体値 (literal entity value) は、現実に実体参照の中に存在している引用符で括られた文字列であり、中間生成規則 EntityValue に対応する。 置換テキスト (replacement text) は、キャラクタ参照やパラメータ実体参照を置き換えた後の実体内容である。

内部実体宣言 (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, 
© 1947 ノditions Gallimard. &rights;
となる。

文書の内容や属性値の中に "&book;" という参照が現れていれば、一般的実体参照 "&rights;" は展開されたであろう。

これらの単純な規則は複雑な相互作用をもつ場合がある。難しい例についての詳細な議論は "D. 実体、キャラクタ参照の展開" を見ること。

4.6 定義済み実体

実体参照もキャラクタ参照もともに、小なり不等号やアンパサンドその他の区切り子をエスケープ (escape) するために使うことができる。一般的実体のセット (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 表記法宣言

表記法 (notation) は、解析されない実体の書式、表記属性を生み出す要素の書式、処理命令がアドレスされるアプリケーションを、名前によって識別する。

表記法宣言 (notation declaration) は、実体や属性リスト宣言の中や属性指定の中で使うために、表記法に名前を与え、 XMLプロセッサやそのクライアントアプリケーションが与えられた表記で書かれたデータの処理ができるヘルパーアプリケーションの位置を決定できるようにしてよい表記法に外部識別子を与える。

表記法宣言
[82]  NotationDecl ::= '<!NOTATION' S Name S (ExternalIDPublicID) S? '>'
[83]  PublicID ::= 'PUBLIC' S PubidLiteral

XMLプロセッサは、アプリケーションに、属性値や属性宣言、実体宣言の中で宣言され、または参照されているどの表記法であってもその名前と外部識別子を与えなければならない。プロセッサは、さらに、外部識別子をシステム識別子やファイル名、その他、記述されている表記法で書かれたデータのためのプロセッサをアプリケーションが呼べるようにするために必要な情報へと解釈する。(しかしながら、XML文書が、XMLプロセッサやアプリケーションが走っているシステム上で利用可能でない、表記法特有のアプリケーションのための表記法を宣言または参照することは、エラーではない。)

4.8 文書実体

文書実体 (document entity) は、実体樹のルート (root) であり、XMLプロセッサにとっての出発点である。この仕様書は、文書実体がXMLプロセッサによってどのように位置を決定されるかは規定しない。他の実体とは異なり、文書実体は名前をもたず、まったく識別なしにプロセッサの入力ストリーム上に現れてもおかしくないのである。

5. 適合性

5.1 妥当性を検証するプロセッサと検証しないプロセッサ

適合的なXMLプロセッサは、2つのクラスに分かれる。妥当性を検証するものと検証しないものとである。

妥当性を検証するプロセッサも検証しないプロセッサも同様に、 文書実体や、プロセッサが読むその他の解析される実体の内容の中にある、この仕様書の整形式性制約の違反を報告しなければならない。

妥当性を検証するプロセッサ (validating processor) は、DTDの中の宣言によって表わされた制約の違反と、この仕様書の中で与えられている妥当性制約を満たすことの失敗を報告しなければならない。これを達成するために、妥当性を検証するXMLプロセッサは、DTD全体と、文書内で参照されている解析される外部実体のすべてを読んで処理しなければならない。

妥当性を検証しないプロセッサは、整形式性について、内部DTDサブセット全体を含めた文書実体をチェックすることだけが要求される。 プロセッサは、妥当性について文書をチェックすることは要求されないが、 内部DTDサブセットの中や、プロセッサが読んだパラメータ実体の中で、プロセッサが読まないパラメータ実体への最初の参照までにあるあるすべての宣言を処理することが要求される。すなわち、プロセッサは、属性値を標準化し、内部実体の置換テキストを取り込みデフォルトの属性値を補うために、 それらの宣言の中の情報を使わなければならない。プロセッサは、読まれないパラメータ実体への参照の後に遭遇した実体宣言属性リスト宣言処理してはならない。実体が上書き宣言を含んでいるかもしれないからである。

5.2 XMLプロセッサの利用

妥当性を検証するXMLプロセッサの挙動は、高度に予見可能である。プロセッサは、文書のすべての部分を読み、すべての整形式性違反および妥当性違反を報告しなければならない。妥当性を検証しないプロセッサでは更に不要であるが、妥当性を検証するプロセッサも、文書のうち文書実体以外の部分は読む必要がない。このことは、XMLプロセッサのユーザにとって重要な場合がある2つの影響をもつ。

異なるXMLプロセッサの間での相互運用において最大の信頼性を得るために、妥当性を検証しないプロセッサを使うアプリケーションは、そうしたプロセッサに要求されない挙動を信頼するべきではない。外部実体内で宣言されたデフォルト属性や内部実体の使用といった能力を要求するアプリケーションは、妥当性を検証するXMLプロセッサを使うべきである。

6. 表記法

XMLの形式的文法は、この仕様書の中で、単純なEBNF (the Extended Backus-Naur Form) 表記法を使って与えられている。文法中の各規則は、次のような形式で、1つのシンボルを定義する。

symbol ::= expression

シンボルは、正規表現によって定義されていれば先頭文字を大文字にして書かれ、そうでない場合には先頭文字を小文字にして書かれている。リテラル文字列は、引用符で括られる。

規則の右辺の表現の内部では、1つ以上のキャラクタの文字列を照合するために、以下の表現が使われる。

#xN
ここで、N は16進法の整数であり、その表記は、符号なし2進数として解釈されたときにその正規的 (UCS-4) コード値が示されている値をもつ、ISO/IEC 10646 のキャラクタに合致する。#xN 形式内の先頭の0の数は重要ではない。対応するコード値の中の先頭の0の数は、使われているキャラクタエンコーディングによって支配されるのであり、XMLにとっては重要ではない。
[a-zA-Z], [#xN-#xN]
示された範囲内(両端を含む)にある値をもつ任意のキャラクタと合致する。
[^a-z], [^#xN-#xN]
示された範囲の外部にある値をもつ任意のキャラクタと合致する。
[^abc], [^#xN#xN#xN]
与えられているキャラクタの中にない値をもつ任意のキャラクタに合致する。
"string"
二重引用符の内側に与えられている文字列に合致するリテラル文字列に合致する。
'string'
単引用符の内側に与えられている文字列に合致するリテラル文字列に合致する。
これらのシンボルは、以下のように、より複雑なパターンを照合するために組み合わせてもよい。ここで、AB は、単純な表現を表わす。
(表現)
表現 は、1つの単位として扱われ、このリストに記述されているように組み合わされる場合がある。
A?
A または無に合致する。任意的な A である。
A B
AB が続いたものに合致する。
A | B
A または B に合致するが、2つともには合致しない。
A - B
A に合致するが B には合致しない任意の文字列と合致する。
A+
A の1回以上の出現と合致する。
A*
A の0回以上の出現と合致する。
生成規則の中で使われているその他の表記法
/* ... */
注釈
[ wfc: ... ]
整形式性制約。これは、生成規則と関連する整形式の文書上の制約を、名前で識別する。
[ vc: ... ]
妥当性制約。これは、生成規則と関連する妥当な文書上の制約を、名前で識別する。

付録

A. 参照資料

A.1 規範的な参照資料

IANA
(Internet Assigned Numbers Authority) Official Names for Character Sets,ed. Keld Simonsen et al. ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets を見ること。
IETF RFC 1766
IETF (Internet Engineering Task Force). RFC 1766: Tags for the Identification of Languages, ed. H. Alvestrand. 1995.
ISO 639
(International Organization for Standardization). ISO 639:1988 (E). Code for the representation of names of languages. [Geneva]: International Organization for Standardization, 1988.
ISO 3166
(International Organization for Standardization). ISO 3166-1:1997 (E). Codes for the representation of names of countries and their subdivisions -- Part 1: Country codes [Geneva]: International Organization for Standardization, 1997.
ISO/IEC 10646
ISO (International Organization for Standardization). ISO/IEC 10646-1993 (E). Information technology -- Universal Multiple-Octet Coded Character Set (UCS) -- Part 1: Architecture and Basic Multilingual Plane. [Geneva]: International Organization for Standardization, 1993 (plus amendments AM 1 through AM 7).
Unicode
The Unicode Consortium. The Unicode Standard, Version 2.0. Reading, Mass.: Addison-Wesley Developers Press, 1996.

A.2 その他の参照資料

Aho/Ullman
Aho, Alfred V., Ravi Sethi, and Jeffrey D. Ullman. Compilers: Principles, Techniques, and Tools. Reading: Addison-Wesley, 1986, rpt. corr. 1988.
Berners-Lee et al.
Berners-Lee, T., R. Fielding, and L. Masinter. Uniform Resource Identifiers (URI): Generic Syntax and Semantics. 1997. (Work in progress; see updates to RFC1738.)
Brüggemann-Klein
Brüggemann-Klein, Anne. Regular Expressions into Finite Automata. Extended abstract in I. Simon, Hrsg., LATIN 1992, S. 97-98. Springer-Verlag, Berlin 1992. Full Version in Theoretical Computer Science 120: 197-213, 1993.
Brüggemann-Klein and Wood
Brüggemann-Klein, Anne, and Derick Wood. Deterministic Regular Languages. Universit舩 Freiburg, Institut f・ Informatik, Bericht 38, Oktober 1991.
Clark
James Clark. Comparison of SGML and XML. http://www.w3.org/TR/NOTE-sgml-xml-971215 を見ること。
IETF RFC1738
IETF (Internet Engineering Task Force). RFC 1738: Uniform Resource Locators (URL), ed. T. Berners-Lee, L. Masinter, M. McCahill. 1994.
IETF RFC1808
IETF (Internet Engineering Task Force). RFC 1808: Relative Uniform Resource Locators, ed. R. Fielding. 1995.
IETF RFC2141
IETF (Internet Engineering Task Force). RFC 2141: URN Syntax, ed. R. Moats. 1997.
ISO 8879
ISO (International Organization for Standardization). ISO 8879:1986(E). Information processing -- Text and Office Systems -- Standard Generalized Markup Language (SGML). First edition -- 1986-10-15. [Geneva]: International Organization for Standardization, 1986.
ISO/IEC 10744
ISO (International Organization for Standardization). ISO/IEC 10744-1992 (E). Information technology -- Hypermedia/Time-based Structuring Language (HyTime). [Geneva]: International Organization for Standardization, 1992. Extended Facilities Annexe. [Geneva]: International Organization for Standardization, 1996.

B. キャラクタのクラス

Unicode 規格に定義されている特性に従って、キャラクタは、基本キャラクタ (base character)(その他には、発音符なしのラテンアルファベットのアルファベットキャラクタが含まれる)、 表意キャラクタ (ideographic character)、組み合わせキャラクタ (combining character)(その他には、このクラスにはほとんどの発音符が含まれる)に分類される。これらのクラスは組み合わさって、文字のクラスを形成する。数字とエクステンダ (extender) も区別される。

キャラクタ
[84]  Letter ::= BaseCharIdeographic
[85]  BaseChar ::= [#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | [#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | [#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | [#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | [#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | [#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | [#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | [#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | [#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | [#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | [#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | [#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | [#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | [#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | [#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | [#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | [#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | [#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | [#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | [#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | [#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | [#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | [#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | [#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | [#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | [#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | [#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | [#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | [#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | [#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | #x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | #x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | #x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | [#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | [#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | #x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | [#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | [#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | [#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | [#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | [#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | #x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | [#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | [#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | [#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | [#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]
[86]  Ideographic ::= [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]
[87]  CombiningChar ::= [#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | [#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | [#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | [#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | #x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | [#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | [#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | #x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | [#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | [#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | #x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | [#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | [#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | [#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | [#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | [#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | #x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | [#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | #x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | [#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | [#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | #x3099 | #x309A
[88]  Digit ::= [#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | [#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | [#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | [#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]
[89]  Extender ::= #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]

ここで定義されているキャラクタクラスは、以下のようにして、Unicode キャラクタデータベースから引き出すことができる。

C. XMLとSGML(参考)

XMLは、妥当なXML文書は適合的なSGML文書でもあるべきだという点で、SGMLのサブセットであるように設計されている。SGMLの制約を超えてXMLが文書に課す追加的制約の詳細な比較は、[Clark] を見ること。

D. 実体およびキャラクタ参照の展開(参考)

この付録には "4.4 XMLプロセッサの実体および参照の扱い" で規定されている実体およびキャラクタ参照の認識と展開の順序を解説する例がある。

DTDに

<!ENTITY example "<p>An ampersand (&#38;#38;) may be escaped
numerically (&#38;#38;#38;) or with a general entity
(&amp;amp;).</p>" >

という宣言があれば、XMLプロセッサは、プロセッサが実体宣言を解析するときにキャラクタ参照を認識し、実体 "example" の値として続いている文字列を保存する前に、キャラクタ参照を解釈することになる。

<p>An ampersand (&#38;) may be escaped
numerically (&#38;#38;) or with a general entity
(&amp;amp;).</p>

文書の中にある "&example;" への参照は、テキストの再解析を生じさせることになる。この時、"p" 要素の開始タグと終了タグが認識されて、3つの参照が認識されて展開され、以下の内容(全データ.区切り子やマークアップはない)をもつ "p" 要素を帰結する。

An ampersand (&) may be escaped
numerically (&#38;) or with a general entity
(&amp;).

もっと複雑な例で、規則とその効果を完全に解説する。以下の例においては、行番号は単なる参考のためのものである。

1 <?xml version='1.0'?>
2 <!DOCTYPE test [
3 <!ELEMENT test (#PCDATA) >
4 <!ENTITY % xx '&#37;zz;'>
5 <!ENTITY % zz '&#60;!ENTITY tricky "error-prone" >' >
6 %xx;
7 ]>
8 <test>This sample shows a &tricky; method.</test>

これは、以下のものを生成する。

E. 決定的内容モデル(参考)

互換性のため、要素型宣言内の内容モデルは決定的であることが要求される。

SGMLは、決定的内容モデル(SGMLは「曖昧さがない」という)を要求する。SGMLシステムを使って組み上げられたXMLプロセッサは、非決定的内容モデルをエラーとしてフラグを立てる場合がある。

たとえば、((b, c) | (b, d)) という内容モデルは、最初の b が与えられても、b にどの要素が続くかを確認するために前を見ることなしには、 モデル内のどちらの b が照合されているのかを知ることができないから、非決定的である。この場合、b への2つの参照は、モデルを (b, (c | d)) にして、1つの参照へ圧縮できる。最初の b は今度は明らかに、内容モデルの中で単一の名前にのみ合致する。パーサは、何が続いているのかを確かめるために前を見る必要はない。cd かのどちらかが受付可能ということになる。

もっと形式的に。たとえば、Aho, Sethi, Ullman [Aho/Ullman] の section 3.9 の algorithm 3.5 といった標準的なアルゴリズムを使って、内容モデルから定型のステートロボット (finite state automaton) を構築してもよい。そうしたアルゴリズムの多くでは、正規表現内の各ポジション(すなわち、正規表現についての文法樹における各葉節)についてフォローセットが構築される。どれかのポジションが、2つ以上のフォローイングポジションが同じ要素型名をつけられているフォローセットをもてば、内容モデルはエラーであって、それがエラーとして報告されてももよい。

多いながらもすべてではない非決定的内容モデルを、自動的に同等の決定的モデルに縮小することを可能にするアルゴリズムが存在する。Brüggemann-Klein 1991 [Brüggemann-Klein] を見ること。

F. キャラクタエンコーディングの自動検知(参考)

XMLエンコーディング宣言は、各実体についての内部的ラベルとして機能し、どのキャラクタエンコーディングが利用されているかを示す。しかしながら、XMLプロセッサは、内部ラベルを読むことができる前に、明らかにどのキャラクタエンコーディングが使われているかを知らなくてはならない。これは、内部ラベルが示そうとしているものである。一般的な場合において、これは望みのない状態である。しかしながら、XMLにおいては完全に望みがないわけではない。XMLは、一般的な場合を2つの方法で制約するからである。各実装は、有限のセットのキャラクタエンコードだけしかサポートしないものと考えられ、 XMLエンコーディング宣言は、通常の場合において各実体の中で使われているキャラクタエンコーディングを自動検知することを実行可能にするために、場所および内容において制限を受ける。また、多くの場合では、XMLデータストリーム自身に加えて、その他の情報源も利用可能である。プロセッサに対してXML実体が表示される際に、何らかの関連する(外部的な)情報がついているかいないかにより、2つの場合は区別可能な場合がある。最初のケースを先に検討する。

UTF-8 または UTF-16 フォーマットで書かれていないXML実体はそれぞれ、XMLエンコーディング宣言ではじまらなければならず、その最初のキャラクタは '<?xml' でなくてはならないから、 適合的なプロセッサはどれであっても、入力から2または4オクテット後で、以下のケースのうちのどれが適用されるかを検知することができる。このリストを読むに際して、UCS-4 では '<' は "#x0000003C"、'?' は "#x0000003F" であり、UTF-16 データストリームの必須のバイト順マークは "xFEFF" であることを知ることが助けになるかもしれない。

この水準の自動検知は、XMLエンコーディング宣言を読み、キャラクタエンコーディング識別子を解析するのに充分である。これは、エンコーディングの各ファミリーの個別のメンバーを区別するために、なお必要である。(例.UTF-8 を 8859 から区別したり、8859 の各部分を互いに区別したり、使われている特定の EBCDIC コードページを区別するためなど)

エンコーディング宣言の内容は ASCIIキャラクタに制限されているから、プロセッサは、エンコーディングのどのファミリーが使われているかを探知してしまえば直ちに、エンコーディング全体を安んじて読むことができる。実際には、広く使われているキャラクタエンコーディングはすべて、上記のカテゴリーのうちのひとつに分けられるから、 XMLエンコーディング宣言は、オペレーティングシステムや転送プロトコルレベルの外部情報源が信頼できないときであっても、相当程度信頼できる、転送中のキャラクタエンコーディングのラベリングを可能にする。

いったん使われているキャラクタコードをプロセッサが検知すれば、各場合について分離している入力ルーチンを呼び出すことによろうが、入力された各キャラクタについて適切な変換関数を呼び出すことによろうが、適切にプロセッサは行動することができる。

任意の自己ラベリングシステムと同様、XMLエンコーディング宣言は、ソフトウェアが実体のキャラクタセットやエンコーディングを、エンコーディング宣言の更新なしに変更すれば、機能しないことになる。キャラクタエンコーディングルーチンの実装は、注意深く、実体をラベルするために使われる内部および外部の情報の正確さを保証するべきである。

ありうる2つ目のケースは、一部のファイルシステムやネットワークプロトコルにおけるように、XML実体にエンコーディング情報が同伴しているときに起こる。複数の情報源が利用可能であるとき、その相対的な優先順位や矛盾処理の好まれる方法は、XMLを配信するために使われるより高次のプロトコルの一部として指定されるべきである。たとえば、内部ラベルや、外部ヘッダ内の MIME 型ラベルの相対的優先順位についての規則は、text/xml や application/xml MIME 型を定義するRFC文書の一部であるべきである。しかしながら、相互運用性の利害関係においては、以下の規則が推奨される。

これらの規則は、プロトコルレベル文書が存在しないときにのみ適用される。とりわけ、text/xml や application/xml という MIME 型が定義されているときは、関連するRFCの勧告がこれらの規則に取って代わることになる。

G. W3C XML ワーキンググループ(参考)

この仕様書は、W3C XMLワーキンググループによって準備され、公表を同意されたものである。この仕様書についてのワーキンググループの賛成は、必ずしもワーキンググループのメンバー全員が賛成に票を投じたことを意味するわけではない。XMLワーキンググループの現在および以前のメンバーは、次の通りである。

Jon Bosak, Sun (座長); James Clark (技術主任); Tim Bray, Textuality and Netscape (XML共同編集者); Jean Paoli, Microsoft (XML共同編集者); C. M. Sperberg-McQueen, U. of Ill. (XML共同編集者); Dan Connolly, W3C (W3C連絡係); Paula Angerstein, Texcel; Steve DeRose, INSO; Dave Hollander, HP; Eliot Kimber, ISOGEN; Eve Maler, ArborText; Tom Magliery, NCSA; Murray Maloney, Muzmo and Grif; Makoto Murata, Fuji Xerox Information Systems; Joel Nava, Adobe; Conleth O'Connell, Vignette; Peter Sharpe, SoftQuad; John Tigue, DataChannel

著作権  (C) 1998 W3C (マサチューセッツ工科大学, フランス国立情報処理自動化研究所, 慶應義塾大学), すべての権利が留保されている。W3Cの 免責 (liability), 商標 (trademark), 文書利用 (document use), ソフトウェア使用許諾 (software licensing) 規則が適用される。


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