第054回_EntityDecl_実体参照時の動作
今回は、構文解析器が実体参照を発見したときの動作について読んでいきます。
出現した位置のW3Cの勧告内容
W3Cの勧告でも良いまとめ方をした部分と思いますが、仕様とするにはいま一歩な気がしますのでさらにまとめていきます。既に説明した箇所もありますが、仕様整理のためにすべて読んでいきます。
実体参照の動作は、出現した位置(最左端の縦のキー項目)と出現した実体参照の種類(最左端以外の横のキー項目)
の2次元テーブルで説明しています。
説明が必要となるのは、
「出現した位置」についてのキー項目の意味
と
キーが交わるテーブル内の内容
となります。
実体参照の種類についてはこれまでのW3Cの説明にあるので説明がありません。
では、「出現した位置」についての説明から見ていきましょう。
The table below summarizes the contexts in which character references, entity references, and invocations of unparsed entities might appear and the required behavior of an XML processor in each case. The labels in the leftmost column describe the recognition context:
Reference in Content
as a reference anywhere after the start-tag and before the end-tag of an element; corresponds to the nonterminal content.
Reference in Attribute Value
as a reference within either the value of an attribute in a start-tag, or a default value in an attribute declaration; corresponds to the nonterminal AttValue.
Occurs as Attribute Value
as a Name, not a reference, appearing either as the value of an attribute which has been declared as type ENTITY, or as one of the space-separated tokens in the value of an attribute which has been declared as type ENTITIES.
Reference in Entity Value
as a reference within a parameter or internal entity's literal entity value in the entity's declaration; corresponds to the nonterminal EntityValue.
as a reference within either the internal or external subsets of the DTD, but outside of an EntityValue, AttValue,PI, Comment, SystemLiteral, PubidLiteral, or the contents of an ignored conditional section(see 3.4 Conditional Sections).
次に上げる表は、文字参照、実体参照、解析対象外実体を呼び出しが現れる文脈と、それぞれの文脈に対するXMLプロセッサに要求される振る舞いを要約したものである。左左端の列は、認識する文脈を意味する。;
内容の中での参照
要素の開始タグの後ろから終了タグの前のどこにでも参照として現れる。; 非終端contentに対応する。
属性値の中での参照
開始タグ内の属性値もしくは属性リスト宣言のデフォルト値の中の参照として現れる。;非終端AttValueに対応する。
属性値としての名前
Nameとして、参照ではなく、ENTITY型として宣言された属性値の値として現れるか、ENTITIES型として宣言された属性値のスペースで区切られたトークンの一つとして現る。
実体値の中での参照
パラメータ実体のリテラルまたは内部一般実体のリテラル-実体宣言のEntityValueの参照として現れる。;非終端EntityValueに対応する。
EntityValue、AttValue、PI、Comment、SystemLiteral,PubidLiteral、条件付セクションのignoreの内容(3.4条件付セクション参照)のいずれでもない内部サブセットDTDまたは外部サブセットDTDの中に参照として現れる。
Entity Type | Character | ||||
Parameter | Internal General | External Parsed General | Unparsed | ||
Reference in Content | Not recognized | Included | Included if validating | Forbidden | Included |
Reference in Attribute Value | Not recognized | Included in literal | Forbidden | Forbidden | Included |
Occurs as Attribute Value | Not recognized | Forbidden | Forbidden | Notify | Not recognized |
Reference in EntityValue | Included in literal | Bypassed | Bypassed | Error | Included |
Reference in DTD | Included as PE | Forbidden | Forbidden | Forbidden | Forbidden |
実体の種類 | 文字参照 | ||||
パラメータ実体 | 内部一般実体 | 外部解析対象一般実体 | 解析対象外実体 | ||
内容の中での参照 | 認識されない | インクルードされる | 妥当性を検証する場合インクルードされる | 許されない | インクルードされる |
属性値の中での参照 | 認識されない | リテラルの中でインクルードされる | 許されない | 許されない | インクルードされる |
属性値としての名前 | 認識されない | 許されない | 許されない | 通知する | 認識されない |
実体値の中での参照 | リテラルの中でインクルードされる | バイパスされる | バイパスされる | エラー | インクルードされる |
DTDの中での参照 | パラメータ実体としてインクルードされる | 許されない | 許されない | 許されない | 許されない |
4.4.2 Included
AT&T;
" expands to "AT&T;
" and the remaining ampersand is not recognized as an entity-reference delimiter.) A character reference is included when the indicated character is processed in place of the reference itself.4.4.3 Included If Validating
4.4.2 インクルードされる
AT&T;
"は"AT&T;
"に展開する。後者の文字列に残ったアンパサンドは実体参照の区切り子とは認識しない。)文字参照は、その参照そのものがあった場所に文字参照が意味する文字を処理するときにインクルードする。4.4.3 妥当性を検証時展開
この規則は
例えば、ブラウザは外部解析対象実体に遭遇すると、その実体参照への視覚的な情報を提供し、表示する要求があった場合にだけ実体の参照先の情報を検索してよい。
- the appearance of a reference to an unparsed entity, except in the EntityValue in an entity declaration.
- the appearance of any character or general-entity reference in the DTD except within an EntityValue or AttValue.
- a reference to an external entity in an attribute value.
4.4.5 Included in Literal
For example, this is well-formed:
<!ENTITY % YN '"Yes"' >
<!ENTITY WhatHeSaid "He said %YN;" >
while this is not:
<!ENTITY EndAttr "27'" >
<element attribute='a-&EndAttr;>
- 解析対象外実体に対する参照が現れた場合、ただし、実体宣言のEntityValueに現れた場合は除く。
- AttValueとEntittyValueを除いたDTDの中に、文字参照または一般実体参照が現れた場合
- 属性値の中に外部実体の参照が有る場合
4.4.5 リテラル内で展開
次の例は整形式である。
<!ENTITY % YN '"Yes"' >
<!ENTITY WhatHeSaid "He said %YN;" >
次の例は整形式ではない。
<!ENTITY EndAttr "27'" >
<element attribute='a-&EndAttr;>
4.4.7 Bypassed
4.4.8 Included as PE
4.4.9 Error
妥当性を検証するプロセッサは、
その実体のシステム識別子と(もしあれば)公開識別子
実体と関連付けられた記法のシステム識別子と(もしあれば)公開識別子
をアプリケーションに通知しなければならない。
4.4.7 バイパスする
4.4.8 パラメータ実体としてインクルードされる
これにより、DTDの中の文法トークンの必要数を含んだパラメータ実体の置換テキストを構成する。
この動作は実体値の中のパラメータ実体参照には適用してはいけない。;
この動作についての説明は、4.4.5リテラルの中でのインクルード にて記述してある。
4.4.9 エラー
文言・記述内容の整理
仕様について整理する前に文言や記述内容について整理します。1. | 内容の中での処理 |
2. | 属性値の中での処理 |
3. | 属性値での実体参照をすべて展開したあとの値に関する処理 |
4. | 実体値の中での処理 |
5. | EntityValue、AttValue、PI、Comment、SystemLiteral、PubidLiteral、 条件付セクションのignoreの内容を除く 内部/外部サブセット上の処理 |
となります。ただし、属性値は、
属性リスト宣言のデフォルト値 と 開始タグの中の属性値
の2つがあるのでこれを分けると、
1. | 内容の中での処理 |
2-1. | 属性リスト宣言のデフォルト値の中での処理 |
2-2. | 開始タグの中の属性値の中での処理 |
3-1. | 属性リスト宣言のデフォルト値の実体参照をすべて展開したあとの値に関する処理 |
3-2. | 開始タグの中の属性値の実体参照をすべて展開したあとの値に関する処理 |
4. | 実体値の中での処理 |
5. | EntityValue、AttValue、PI、Comment、SystemLiteral、PubidLiteral、 条件付セクションのignoreの内容を除く、内部/外部サブセット上の処理 |
-4.4.1 "認識しない"について
# 処理は何もありません。
つまり、構文解析器によって文脈上で文字参照/実体参照を認識したときは、
4.4.2~4.4.9の仕様に従って処理します。
一方で、文字参照/実体参照の表現があっても、構文解析器がその文脈によって文字参照/実体参照を認識しないときは、それは文字データかそれ以外の何かに認識するため、文字参照や実体参照としての仕様は意識する必要はありません。
-4.4.2 "インクルードされる"について
●余分な文を削除して仕様をスッキリする
(但しパラメータ実体はマークアップを含む事はできない)。
マークアップは、いつも通りに認識する
よって、実体参照の認識時の動作の仕様としては無視します。
●表現に関する分析
実体値の説明「実体値となる置換テキストを入手して処理した時」
と、
文字参照の説明「文字参照が意味する文字を処理するとき」
の2つの表現です。
この2つの表現が意味するところはいつなのでしょうか?つまり、そもそもの「処理するとき」とはいつなのかがわかりません。
本コラムではこれを「認識したとき」とします。
# processedについて明確な定義があれば良いのですが、それがなく、
# 単純にprocessedと書くとプログラムは全ての工程が処理なので、
# どのタイミングなのかが判断できません。
# もし私なら、recognizedと書くと思います。
ここからは推測になります。
▼タイトルの違いからみる推測
4.4.1 認識しない
と
4.4.7 バイパスする
とは異なる内容を持ちます。つまり、認識した後でかつバイパスしないように処理します。
▼Contentの処理から見る推測
hogehoge&sample;&sample2;fugafuga
という入力があり、
&sample;
を認識し、置換テキストに置き換えずに、次のトークン&sample2;
の解析に移ったとすると、もはや構文解析器は&sample;に対して入力の終わりまでなんらかの処理を行うタイミングを失います。要するに、
認識したときにすぐに処理する
か
入力を構文解析しおわったときに処理する
かの2択になります。
▼仕様を決定する
まず、モジュール構成について考えると、実体参照の認識処理は意味解析を意味しています。ただし、実体参照の置換テキスト内をさらに構文解析することまで考慮すると、構文解析の文脈を探す処理と考えてもよさそうです。
次に、処理コストでいうとあまり細かく触れませんが、認識してすぐに処理したほうが少なく済みます。
よって、「認識したときにすぐに処理する」ことにします。
●先に文字参照の定義から処理を検討する
そこで文字参照から検討します。
原文における、
# 文字参照は、その参照そのものがあった場所に文字参照が意味する文字を処理するときにインクルードする。
について考えます。
構文解析器がcontent処理中に、文字参照を認識したとき(★)
ISO/IEC 10646のコードポイントを参照することで置換テキストRepTextを得て、これをCharData (RepText)とする。
#
# ★についての補足
# SYMBOL (&#) WORD ([0-9]+) SYMBOL (;)
# または、
# SYMBOL (&#x) WORD ([0-9a-fA-F]+) SYMBOL (;)
# のトークンリストが構文解析でOKになったとき、
#
構文解析器がAttValue処理中に、文字参照を認識したとき
ISO/IEC 10646のコードポイントを参照することで置換テキストRepTextを得て、
これをNORMAL_TOKEN_A1 (RepText)または、NORMAL_TOKEN_A2 (RepText)とする。
構文解析器がEntityValue処理中に、文字参照を認識したとき
ISO/IEC 10646のコードポイントを参照することで置換テキストRepTextを得て、
これをNORMAL_TOKEN_B1 (RepText)または、NORMAL_TOKEN_B2 (RepText)とする。
●例の注意点
# (例えば、文字列"
AT&T;
"は"AT&T;
"に展開する。# 後者の文字列に残ったアンパサンドは実体参照の区切り子とは認識しない。)
について考えます。 構文解析器は入力バッファ"
AT&T;
"を前方からトークンに分け、処理します。尚、4.4.2で説明する実体はcontentの処理ですから、
この場合に使用する条件付字句解析器はNormalSectionで、対応するEBNFデータツリーはcontentであることが
分かります。
また、
&
は 4.6 定義済み実体で説明がある内容で、<!ENTITY amp "
&#38;
">を意味します。
さらに、この置換テキスト(&)は実体宣言の解析でEntityValueを読み込むときに、
SYMBOL (&#) WORD (38) SYMBOL (;) 未処理バッファ[#38;]
を解析し、これをNORMAL_TOKEN_B1 (&)に置き換えます。
よって、残りの未処理バッファを解析すると、
NORMAL_TOKEN_B1 (&) NORMAL_TOKENB1 (#38;)
を得ます。
#
# 自ら自分の定義を証明するようですが、
# この文字列に残った & は、実体参照の区切り子として認識しません。
#
最終的に、一般実体テーブルに、
Key | 置換テキスト
------------------------
amp |
&
登録します。
●一般実体の定義から導出する処理
# [定義: 実体は、実体値となる置換テキストを入手して処理した時、
# 参照先にインクルードする。
# インクルードした結果は、あたかも文書中でその参照を認識した場所に、
# 最初から置換テキストがあったように処理する。]
について考えます。
構文解析器がcontent処理中に、一般実体の参照を認識したとき、
●例を用いた検証
原文
# (例えば、文字列"AT&
T;"は"AT&T;"に展開する。
なので、
入力バッファ[AT&
T;]に対して出力[AT&T]
を得ます。
2. CharData (AT) SYMBOL (&) 未処理バッファ[amp;T; ]
3. CharData (AT) SYMBOL (&) WORD (amp) 未処理バッファ[;T; ]
4. CharData (AT) SYMBOL (&) WORD (amp) SYMBOL (;) 未処理バッファ[T; ]
5. CharData (AT) SYMBOL (&) WORD (amp) SYMBOL (;) CharData (T;)
6. 一般実体の参照を検知したので、処理する
6-1. 一般実体テーブルをkey (amp)で検索する
6-2. 置換テキスト "
&
" を得る6-3. (4.3.2整形式の解析対象実体で説明したように)置換テキストをcontentにマッチするか確認する
6-3-1. 置換テキストを、 SYMBOL (&#) WORD (38) SYMBOL (;) に構文解析する。
6-3-2. 文字参照/contentを検知したので、CharData (&)に置き換える。
6-4. 置換テキストCharData (&)を得る
7. CharData (AT) CharData (&) CharData (T;)
→出力[AT&T;] を得たので検証成功とする。
-4.4.3 "妥当性を検証時展開"について
妥当性を検証しないプロセッサ
外部解析対象実体の参照:置換テキストをインクルードする
または、インクルードしない場合は、読み込まなかった旨をアプリケーションに伝える
妥当性を検証するプロセッサ
外部解析対象実体の参照:置換テキストをインクルードする
と説明したので、次のように整理できます。
●妥当性を検証しないプロセッサ
1-2.実体が外部・解析対象・一般実体であるなら、置換テキストRepTextを取得する。
1-3.一般実体のトークン列 SYMBOL (&) WORD (Name) SYMBOL (;)の代わりにCharData (RepText)を得る。
または、
2-1. 一般実体のトークン列をそのままに、読み込まなかった旨をアプリケーションに通知する。
●妥当性を検証するプロセッサ
1-2.実体が外部・解析対象・一般実体であるなら、置換テキストRepTextを取得する。
1-3.一般実体のトークン列 SYMBOL (&) WORD (Name) SYMBOL (;)の代わりにCharData (RepText)を得る。
-4.4.4 "禁止"について
# 以下のものは許されない、致命的なエラーになる。
# ・解析対象外実体に対する参照が現れた場合、
# ただし、実体宣言のEntityValueに現れた場合は除く。
# ・AttValueとEntittyValueを除いたDTDの中に、
# 文字参照または一般実体参照が現れた場合
# ・属性値の中に外部実体の参照が有る場合
の1つ目と3つ目から、次のようにできます。
・構文解析器がcontent処理中に、一般実体の参照を認識したとき、
一般実体のトークンの中のWORD(Name)をkeyに一般実体テーブルを検索し、
それが外部・解析対象外・一般実体であるなら、致命的エラーとする。
・構文解析器が属性リスト宣言のデフォルト値の処理中に、一般実体の参照を認識したとき、
一般実体のトークンの中のWORD(Name)をkeyに一般実体テーブルを検索し、
それが外部・解析対象外・一般実体であるなら、致命的エラーとする。
・構文解析器が開始タグの中の属性値の処理中に、一般実体の参照を認識したとき、
一般実体のトークンの中のWORD(Name)をkeyに一般実体テーブルを検索し、
それが外部・解析対象外・一般実体であるなら、致命的エラーとする。
・構文解析器が属性リスト宣言のデフォルト値の処理中に、一般実体の参照を認識したとき、
一般実体のトークンの中のWORD(Name)をkeyに一般実体テーブルを検索し、
それが外部・解析対象・一般実体であるなら、致命的エラーとする。
・構文解析器が開始タグの中の属性値の処理中に、一般実体の参照を認識したとき、
一般実体のトークンの中のWORD(Name)をkeyに一般実体テーブルを検索し、
それが外部・解析対象・一般実体であるなら、致命的エラーとする。
尚、2つ目についてはDTDの中で構文に現れないパラメータ実体参照を念頭に書かれたものであるため、構文にはないにせよ、実装方法によっては、文字参照や一般実体参照を認識するかもしれず、その場合を考慮に入れて書いてあります。本コラムが作成するプログラムは、文字参照や一般実体参照を認識しないように実装するのでここの仕様を実装することはありません。
-4.4.5 "リテラルの中で展開"について
内部・解析対象・パラメータ実体/EntityValue
内部・解析対象・一般実体/AttValue
を説明しています。
また、置換テキストにある引用符をリテラルとして扱う例がありますので、
処理をまとめた上で例をつかって検証します。
●処理
パラメータ実体のトークン列 SYMBOL (%) WORD (Name) SYMBOL (;)の代わりにNORMAL_TOKEN_B1 (RepText)または、NORMAL_TOKEN_B2 (RepText)を得る。
一般実体のトークン列 SYMBOL WORD (Name) SYMBOL (;)の代わりにNORMAL_TOKEN_A1 (RepText)または、NORMAL_TOKEN_A2 (RepText)を得る。
●例を用いた検証
原文
# <!ENTITY % YN '"Yes"' >
# <!ENTITY WhatHeSaid "He said %YN;" >
なので、
入力バッファ[He said %YN;]に対して出力[He said "Yes"]を得る。
検証1
パラメータ実体テーブル
Key | 置換テキスト
------------------------
YN | "Yes"
1. NORMAL_TOKEN_B1 (He said ) 未処理バッファ[YN;]
2. NORMAL_TOKEN_B1 (He said ) SYMBOL () 未処理バッファ[YN;]
3. NORMAL_TOKEN_B1 (He said ) SYMBOL (%) WORD (YN) 未処理バッファ[;]
4. NORMAL_TOKEN_B1 (He said ) SYMBOL (%) WORD (YN) SYMBOL (;)
5. パラメータ実体の参照を検知したので、処理する
5-1. パラメータ実体テーブルをkey (YN)で検索する
5-2. 置換テキスト "Yes" を得る
5-3. 置換テキストNORMAL_TOKEN_B1 ("Yes")を得る
6. NORMAL_TOKEN_B1 (He said ) NORMAL_TOKEN_B1 ("Yes")
→出力[He said "Yes"] を得たので検証成功とする。
# 次の例は整形式ではない。
#
# <!ENTITY EndAttr "27'" >
# <element attribute='a-&EndAttr;>
実体テーブル
Key | 置換テキスト
------------------------
EndAttr | 27'
1. NORMAL_TOKEN_A2 (a-) 未処理バッファ[&EndAttr;>]
2. NORMAL_TOKEN_A2 (a-) SYMBOL (&) 未処理バッファ[EndAttr;>]
3. NORMAL_TOKEN_A2 (a-) SYMBOL (&) WORD (EndAttr) 未処理バッファ[;>]
4. NORMAL_TOKEN_A2 (a-) SYMBOL (&) WORD (EndAttr) SYMBOL (;) 未処理バッファ[>]
5. 一般実体の参照を検知したので、処理する
5-1. 一般実体テーブルをkey (EndAttr)で検索する
5-2. 置換テキスト 27' を得る
#次々回に説明する処理が本来は必要!
5-3. 置換テキストNORMAL_TOKEN_A2 (27')を得る※'はAttValueの終りと認識しない
6. 構文解析AttValue中に>遭遇し、トークンの作成に失敗(字句解析エラー)
よって整形式でないことを検出できる。
-4.4.6 "通知する"について
その属性値が属性リスト宣言でENTITY型、またはENTITIES型として宣言してある場合、
その属性値をkeyに一般実体テーブルを検索し、
それが外部・解析対象外・一般実体であるなら、
システム識別子と(もしあれば)公開識別子
および、関連付けられた記法の
システム識別子と(もしあれば)公開識別子
をアプリケーション通知用データとして抽象構文木に追加する。
-4.4.7 "バイパスする"について
それが 内部・解析対象・一般実体である、
または、外部・解析対象・一般実体である場合、
何もせずに次のトークンを読む処理を続ける。
-4.4.8 "パラメータ実体としてインクルードされる"について
1-1.パラメータ実体のトークンの中のWORD (Name)をkeyにパラメータ実体テーブルを検索する。
1-2.パラメータ実体であるなら、置換テキストRepTextを取得する。
1-3.置換テキストRepTextの先頭と末尾に#x20を追加してRepText2にする。
1-4.パラメータ実体のトークン列 SYMBOL (%) WORD (Name) SYMBOL (;)の代わりにRepText2を得る。
1-5.文脈中の入力バッファにRepText2を差し戻す。
または、
2-1. パラメータ実体のトークン列をそのままに、読み込まなかった旨をアプリケーションに通知する。
1-1.パラメータ実体のトークンの中のWORD (Name)をkeyにパラメータ実体テーブルを検索する。
1-2.パラメータ実体であるなら、置換テキストRepTextを取得する。
1-3.置換テキストRepTextの先頭と末尾に#x20を追加してRepText2にする。
1-4.パラメータ実体のトークン列 SYMBOL (%) WORD (Name) SYMBOL (;)の代わりにRepText2を得る。
1-5.文脈中の入力バッファにRepText2を差し戻す。
-4.4.9 "エラー"について
仕様整理
また、必要があれば前回までの内容を含めます。
さらに、前々回の議論より「出現した位置」毎の仕様は細かい場合分けになります。これによって、マークアップ宣言自体が「外部/内部サブセットが無い」という条件を無視できるようになり、無用な部分を削除できます。
-Contentの処理
1-1.ISO/IEC 10646のコードポイントを参照することで置換テキストRepTextを得る。
1-2.文字参照のトークン列の代わりにCharData (RepText)を返す。 2.一般実体の参照を認識したとき、
2-1.実体名がamp, lt, gt, apos, quoteの場合(定義済み実体の場合)
2-1-1.それぞれ置換テキストCharData (
&
)、CharData (<
)、CharData (>)、CharData (')、CharData (")を返す。2-2.実体名がamp, lt, gt, apos, quoteでない場合(定義済み実体でない場合)
2-2-1.実体名をキーに一般実体テーブルを検索する
2-2-2.実体名がテーブルに無い場合
2-2-2-1.スタンドアロン文書宣言がyesのとき
2-2-2-1-1.整形式性制約違反エラー
2-2-2-2.スタンドアロン文書宣言がnoのとき
2-2-2-2-1.外部サブセットが無い場合
2-2-2-2-1-1.内部サブセットが無い場合
2-2-2-2-1-1-1.整形式性制約エラー
2-2-2-2-1-2.内部サブセットが有る場合
2-2-2-2-1-2-1.パラメータ実体の参照が有る場合
2-2-2-2-1-2-1-1.妥当性制約違反エラー
2-2-2-2-1-2-2.パラメータ実体の参照が無い場合
2-2-2-2-1-2-2-1.整形式性制約エラー
2-2-2-2-2.外部サブセットが有る場合
2-2-2-2-2-1.妥当性制約違反エラー
2-2-3.実体名がテーブルに有る場合
2-2-3-1.実体が内部・解析対象・一般実体または、外部・解析対象・一般実体の場合
2-2-3-1-1.再帰用のスタックに既に同名の実体名があるかチェックする
2-2-3-1-2.再帰用のスタックに既に同名の実体名が有る場合
2-2-3-1-2-1. 整形式性制約エラー
2-2-3-1-3.再帰用のスタックに既に同名の実体名が無い場合
2-2-3-1-3-1.再帰用のスタックに実体名を追加する
2-2-3-1-3-2.置換テキストRepTextを取得する
2-2-3-1-3-3.一般実体のトークン列の代わりにCharData (RepText)を返す。
2-2-3-2.その他(実体が解析対象外実体)の場合
2-2-3-2-1.整形式性制約エラー/致命的エラーとする
1-1.ISO/IEC 10646のコードポイントを参照することで置換テキストRepTextを得る。
1-2.文字参照のトークン列の代わりにNORMAL_TOKEN_A1 (RepText)または、NORMAL_TOKEN_A2 (RepText)を返す。 ※属性リスト宣言の存在自体が、「外部サブセットが有る」または、「内部サブセットが有る」を示すので該当部分を削除
2.一般実体の参照を認識したとき
2-1.実体名がamp, lt, gt, apos, quoteの場合(定義済み実体の場合)
2-1-1.それぞれ置換テキスト
NORMAL_TOKEN_A1 (
&
)、NORMAL_TOKEN_A2 (&
)、NORMAL_TOKEN_A1 (
<
)、NORMAL_TOKEN_A2 (<
)、NORMAL_TOKEN_A1 (>)、 NORMAL_TOKEN_A2 (>)、
NORMAL_TOKEN_A1 (')、 NORMAL_TOKEN_A2 (')、
NORMAL_TOKEN_A1 (") NORMAL_TOKEN_A2 (")
を返す。
2-2.実体名がamp, lt, gt, apos, quoteでない場合(定義済み実体でない場合)
2-2-1.実体名をキーに一般実体テーブルを検索する
2-2-2.実体名がテーブルに無い場合
2-2-2-1.スタンドアロン文書宣言がyesのとき
2-2-2-1-1.整形式性制約違反エラー
2-2-2-2.スタンドアロン文書宣言がnoのとき
2-2-2-2-1.外部サブセットが無い場合
2-2-2-2-1-1.内部サブセットにパラメータ実体の参照が有る場合
2-2-2-2-1-1-1.妥当性制約違反エラー
2-2-2-2-1-2.内部サブセットにパラメータ実体の参照が無い場合
2-2-2-2-1-2-1.整形式性制約エラー
2-2-2-2-2.外部サブセットが有る場合
2-2-2-2-2-1.妥当性制約違反エラー
2-2-3.実体名がテーブルに有る場合
2-2-3-1.実体が内部・解析対象・一般実体の場合
2-2-3-1-1.再帰用のスタックに既に同名の実体名があるかチェックする
2-2-3-1-2.再帰用のスタックに既に同名の実体名が有る場合
2-2-3-1-2-1. 整形式性制約エラー
2-2-3-1-3.再帰用のスタックに既に同名の実体名が無い場合
2-2-3-1-3-1.再帰用のスタックに実体名を追加する
2-2-3-1-3-2.置換テキストRepTextを取得する
2-2-3-1-3-3.一般実体のトークン列の代わりにNORMAL_TOKEN_A1 (RepText)または、NORMAL_TOKEN_A2 (RepText)を返す。
2-2-3-2.その他(実体が外部・解析対象・一般実体または、外部・解析対象外・一般実体)の場合
2-2-3-2-1.整形式性制約エラー/致命的エラーとする
-属性リスト宣言のデフォルト値の実体参照をすべて展開したあとの値に関する処理
1.属性リスト宣言のTYPEがENTITY型、またはENTITIES型の場合
1-1.属性値(AttValue自体)をkeyに一般実体テーブルを検索する
1-2.検索したレコードがある場合
1-2-1.外部・解析対象外・一般実体の場合
システム識別子と(もしあれば)公開識別子
および、関連付けられた記法のシステム識別子と(もしあれば)公開識別子
をアプリケーション通知用データとして抽象構文木に追加する。
1-2-2.解析対象外・一般実体でない場合
# 未だ解説していないが、3.3.2 属性デフォルトにその場合の処理について書いてある
# この場合、実際に開始タグの内容として呼び出すまでエラーとはしない。
1-3.検索したレコードが無い場合
妥当性制約
2.属性リスト宣言のTYPEがENTITY型でもENTITIES型でもない場合
特に処理なし -開始タグの中の属性値の中での処理
1-1.ISO/IEC 10646のコードポイントを参照することで置換テキストRepTextを得る。
1-2.文字参照のトークン列の代わりにNORMAL_TOKEN_A1 (RepText)または、NORMAL_TOKEN_A2 (RepText)を返す。 2.一般実体の参照を認識したとき、
2-1.実体名がamp, lt, gt, apos, quoteの場合(定義済み実体の場合)
2-1-1.それぞれ置換テキスト
NORMAL_TOKEN_A1 (
&
)、NORMAL_TOKEN_A2 (&
)、NORMAL_TOKEN_A1 (
<
)、NORMAL_TOKEN_A2 (<
)、NORMAL_TOKEN_A1 (>)、 NORMAL_TOKEN_A2 (>)、
NORMAL_TOKEN_A1 (')、 NORMAL_TOKEN_A2 (')、
NORMAL_TOKEN_A1 (") NORMAL_TOKEN_A2 (")
を返す。
2-2.実体名がamp, lt, gt, apos, quoteでない場合(定義済み実体でない場合)
2-2-1.実体名をキーに一般実体テーブルを検索する
2-2-2.実体名がテーブルに無い場合
2-2-2-1.スタンドアロン文書宣言がyesのとき
2-2-2-1-1.整形式性制約違反エラー
2-2-2-2.スタンドアロン文書宣言がnoのとき
2-2-2-2-1.外部サブセットが無い場合
2-2-2-2-1-1.内部サブセットが無い場合
2-2-2-2-1-1-1.整形式性制約エラー
2-2-2-2-1-2.内部サブセットが有る場合
2-2-2-2-1-2-1.パラメータ実体の参照が有る場合
2-2-2-2-1-2-1-1.妥当性制約違反エラー
2-2-2-2-1-2-2.パラメータ実体の参照が無い場合
2-2-2-2-1-2-2-1.整形式性制約エラー
2-2-2-2-2.外部サブセットが有る場合
2-2-2-2-2-1.妥当性制約違反エラー
2-2-3.実体名がテーブルに有る場合
2-2-3-1.実体が内部・解析対象・一般実体の場合
2-2-3-1-1.再帰用のスタックに既に同名の実体名があるかチェックする
2-2-3-1-2.再帰用のスタックに既に同名の実体名が有る場合
2-2-3-1-2-1. 整形式性制約エラー
2-2-3-1-3.再帰用のスタックに既に同名の実体名が無い場合
2-2-3-1-3-1.再帰用のスタックに実体名を追加する
2-2-3-1-3-2.置換テキストRepTextを取得する
2-2-3-1-3-3.一般実体のトークン列の代わりにNORMAL_TOKEN_A1 (RepText)または、NORMAL_TOKEN_A2 (RepText)を返す。
2-2-3-2.その他(実体が外部・解析対象・一般実体または、外部・解析対象外・一般実体)の場合
2-2-3-2-1.整形式性制約エラー/致命的エラーとする
1.属性リスト宣言のTYPEがENTITY型、またはENTITIES型の場合
1-1.属性値(AttValue自体)をkeyに一般実体テーブルを検索する
1-2.検索したレコードが外部・解析対象外・一般実体の場合
システム識別子と(もしあれば)公開識別子
および、関連付けられた記法のシステム識別子と(もしあれば)公開識別子
をアプリケーション通知用データとして抽象構文木に追加する。
1-3.検索したレコードが外部・解析対象外・一般実体でない場合
3.3.1にある妥当性制約違反
2.属性リスト宣言のTYPEがENTITY型でもENTITIES型でもない場合
特に処理なし
1-1.ISO/IEC 10646のコードポイントを参照することで置換テキストRepTextを得る。
1-2.文字参照のトークン列の代わりにNORMAL_TOKEN_B1 (RepText)または、NORMAL_TOKEN_B2 (RepText)を返す。 2.一般実体の参照を認識したとき
2-1.実体名をキーに一般実体テーブルを検索する
2-2.実体名がテーブルに無い場合
仕様なし
2-3.実体名がテーブルに有る場合
2-3-1.実体が内部・解析対象・一般実体または、外部・解析対象・一般実体の場合
2-3-1-1.バイパスする(何もしない)
2-3-2.その他(外部・解析対象外・一般実体)の場合
エラーとする
※EntityValueを含む実体宣言の存在自体が、「外部サブセットが有る」または、「内部サブセットが有る」を示すので該当部分を削除
3.パラメータ実体の参照を認識したとき
3-1.実体名をキーにパラメータ実体テーブルを検索する
3-2.実体名がテーブルに無い場合
3-2-1.スタンドアロン文書宣言がyesのとき
3-2-1-1.★仕様なし
3-2-2.スタンドアロン文書宣言がnoのとき
3-2-2-1.外部サブセットが無い場合
3-2-2-1-1.★仕様なし
3-2-2-2.外部サブセットが有る場合
3-2-2-2-1.妥当性制約違反エラー
3-3.実体名がテーブルに有る場合
3-3-1.再帰用のスタックに既に同名の実体名があるかチェックする
3-3-2.再帰用のスタックに既に同名の実体名が有る場合
3-3-2-1. 整形式性制約エラー
3-3-3.再帰用のスタックに既に同名の実体名が無い場合
3-3-3-1.再帰用のスタックに実体名を追加する
3-3-3-2.置換テキストRepTextを取得する。
3-3-3-3.パラメータ実体のトークン列の代わりにNORMAL_TOKEN_B1 (RepText)または、NORMAL_TOKEN_B2 (RepText)を返す。
1.パラメータ実体の参照を認識したとき
1-1.実体名をキーにパラメータ実体テーブルを検索する
1-2.実体名がテーブルに無い場合
1-2-1.スタンドアロン文書宣言がyesのとき
1-2-1-1.★仕様なし
1-2-2.スタンドアロン文書宣言がnoのとき
1-2-2-1.外部サブセットが無い場合
1-2-2-1-1.★仕様なし
1-2-2-2.外部サブセットが有る場合
1-2-2-2-1.妥当性制約違反エラー
1-3.実体名がテーブルに有る場合
1-3-1.再帰用のスタックに既に同名の実体名があるかチェックする
1-3-2.再帰用のスタックに既に同名の実体名が有る場合
1-3-2-1. 整形式性制約エラー
1-3-3.再帰用のスタックに既に同名の実体名が無い場合
1-3-3-1.再帰用のスタックに実体名を追加する
1-3-3-2.置換テキストRepTextを取得する。
1-3-3-3.置換テキストRepTextの先頭と末尾に#x20を追加してRepText2にする。
1-3-3-4.パラメータ実体のトークン列の代わりにRepText2を得る。
1-3-3-5.文脈中の入力バッファにRepText2を差し戻す。
長くなりましたので次回に続きます。