-
Notifications
You must be signed in to change notification settings - Fork 4
/
753.txt
235 lines (194 loc) · 9.49 KB
/
753.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
[5] [DFN[[RUBYB[実体宣言]@en[entity declaration]]]]は、
[[実体]]を[[宣言]]する[[マーク付け宣言]]でした。
* SGML における実体宣言
[1]
>[[参照]]を可能にするために、1つの[[実体]]に [[SGML名]]を指定する[[マーク宣言]]。
Entity declaration。 [INS[([[JIS X 4151]]‐1992 3. (116))]]
- [13] [CODE(ABNF)[[DFN[実体宣言]] := [CODE(SGML)[[[mdo]]]] [[ENTITY]] 1*[[ps]] 実体名 1*ps [[実体文]] *ps [CODE(SGML)[[[mdc]]]] ;; (101)]]
- [14] [CODE(ABNF)[[DFN[実体名]] := [[名前]] / ([CODE(SGML)[[[rni]]]] [[DEFAULT]]) / ([CODE(SGML)[[[pero]]]] 1*[[ps]] 名前) ;; (102), (103), (104)]]
[2] [[規格参照具象構文]]では、 [SAMP(SGML)[<!ENTITY ent "EntityValue">]] のような記述となります。
[11] SGML [[文書実体]]で参照されるほとんどの実体は実体宣言で宣言されているものです。[WEAK[その例外は、[[文書型宣言]]の[[外部部分集合]]とか、[[連結型宣言]]の外部部分集合とか、幾つかあるにはあります。]]
[15] 実体名の [CODE(SGML)[pero]] 辺りは[[認知]]の特例になっています。
本来 [CODE(SGML)[pero]] は文脈上の制約があって、
直後に[[名前文字]]などが続く場合のみ認知しますが、
ここでは特別に制約なしで[[区切子]]として認知します。また、
その直後の [CODE(SGML)[ps]] は必須です。これによって、
[[引数実体参照]]と区別しています。
[17] Web SGML では、[[外部引数実体]]に[[記法名]]を指定することで[[DTDデータ実体]]を参照させることができます。 (K.4.10.2 参照)
[[#comment]]
*同じ名前に対する複数個の実体宣言
[3] [[XML]] 仕様書 <http://www.w3.org/TR/REC-xml#sec-entity-decl> 曰く:
> If the same entity is declared more than once, the first declaration encountered is binding; at user option, an XML processor may issue a warning if entities are declared multiple times.
(同じ実体が複数回宣言されていたなら、最初に現れた宣言が[[束縛]]される。
[[利用者の任意選択]]により、 [[XML処理系]]は実体が複数回宣言されたときに[[警告]]を出しても良い。)
[[#comment]]
** 実体宣言の優先順
[16]
= 1番目に活性状態になった[[連結型宣言部分集合]]の実体宣言
== [[連結型宣言]]の[[内部部分集合]]の実体宣言
== 連結型宣言の[[外部部分集合]]の実体宣言
= 2番目に活性状態になった〜(略) (JIS X 4151‐1992 11.1.4.1 参照。)
= (原始)[[文書型宣言部分集合]]の実体宣言
== [[文書型宣言]]の内部部分集合の実体宣言
== 文書型宣言の外部部分集合の実体宣言
複数の文書型宣言間でどれが採用されるかは、
[CODE(WikiPage)[[[実体参照//対応する実体宣言]]]]を参照。
[[#comment]]
** 優先度の低い (無視される) 実体宣言の妥当性
[4] さて問題です。無視された実体宣言の[[実体値]]などに関する制約は課せられるのでしょうか?
とりあえず、構文的な制約は課せられると考えて間違いないでしょう。
ですから、 [SAMP(XML)[<!ENTITY ent "foo"><!ENTITY ent "&">]]
は[[致命的誤り]]となるはずです。
[6] [[非解析実体]]が参照されている場合:
[SAMP(XML)[<!ENTITY ent "foo" NDATA defined-notation><!ENTITY ent "foo" NDATA undefined-notation>]]。
妥当性制約「記法が宣言されていること」<http://www.w3.org/TR/REC-xml#not-declared>
は、
「The Name must match the declared name of a notation.」
([CODE(XML)[[[Name]]]] は宣言された記法の名前に一致しなければならない。)
と述べています。状況についての言及はなく、構文についてのみの言及ですから、
この妥当性制約は無視される場合も有効と思われます。
続き (記法がらみ) は[[記法]>>3]辺りへ。
[7] [[文書]]全体の整形式性について、 <http://www.w3.org/TR/REC-xml#dt-wellformed>
は、
- 文書全体として [CODE(XML)[[[Document]]]] に一致すること。
- すべての[[XML//整形式制約]]を満たすこと。
- 直接または間接に''参照している''すべての実体が整形式であること。
と言っています。無視されている実体 (であったであろうもの)
が参照されていないことは明らかです。 (無視されていなくても、
文書中で参照されていなければ整形式でなくてもいいようです。)
[8] 実体についての制限のほとんどは[[置換文]]が対象だから、
無視された宣言や参照されていない実体の宣言はあんまり制約されないのかな。
[9] [[実体参照//解決]>>26]に言及がある仕様の修正は重要。この修正がないと、非解析実体への参照がないか無視された宣言や参照されていない実体の宣言もチェックしないといけなかった。
[10] >>9 しかし他にも問題はある。 XML 名前空間の仕様
<http://www.w3.org/XML/xml-names-19990114-errata#NE08>
曰く:
> All other tokens in the document which are required, for XML 1.0 well-formedness, to match the XML production for Name, must match this specification's production for NCName.
(文書中の全ての他の [WEAK[([CODE(XML)[[[QName]]]] 以外の)]],
XML 1.0 整形式性のために XML 生成規則 [CODE(XML)[Name]]
と一致する必要がある字句は、
[WEAK[(名前空間整形式であるためには)]] この仕様書の生成規則
[CODE(XML)[[[NCName]]]] と一致しなければなりません。)
>>7 の1つめの整形式性条件 (構文一致) とこの規定により、
実体値中の一般実体参照も [CODE(XML)[NCName]]
である必要があります。
まあ、もともと一般実体参照以外の [CODE(XML)[&]]
をチェックしないといけないのですから、
大した手間ではないのですが。
実体値中の実体参照の名前だけではなく、 [CODE(XML)[NDATA]]
の後の記法名も影響されます。
[[#comment]]
* メモ
[12] [WEAK[2003-09-14 03:08:10 +00:00]] ''[[名無しさん]]'':
[SAMP(XML)[<!ENTITY lt "<"><!-- (正) --> <!-- ... --> <!ENTITY lt "なにか。"><!-- (誤) -->]]
ってのは高々警告で済ませるべきものですよねぇ。今の
[CODE(perl)[[[Message::Markup::XML::Parser]]]]
は致命的誤りにしちゃうんだけど。。。
[18] なんとなく書いてみたけど途中で面倒になって止めた図:
[PRE[
mdo
#
'ENTITY'
|
+--+--+
| #
r ps
| |
+---+-+
|
+--++---+
| # #
| pero rni
| | |
| +++ |
| | | |
| r # |
| | ps |
| | | |
+-+-+---+
|
+<-r---+--+
| #
| name
# |<----------r------------------+
+<-r------+--+ |
| # |
| ps |
# | |
+---+--------+-+--------+----------+ |
| # # # # |
| 'CDATA' 'SYSTEM' 'PUBLIC' keyword -+
| 'SDATA' | |
| 'PI' | +-+-+
| 'STARTTAG' | | #
| 'ENDTAG' | r ps
| 'MS' | | |
| 'MD' | +-+-+
| | | |
| | | +-+-+
| | | | #
| | | r publit
| | | | |
| | +-+-----+---+
| | |
| | +------+
| | | #
| | | ps
| | | |
| | | +---+
| | | | #
| | | | syslit
| | | | |
| | | | +--+---+<-------------+
| | | | | # |
| | | | +-+-+ ps |
| | | | | | | |
| | | | | (kwd) | |
| | |<-----|-+ r | |
| | | | | | |
| | | +<----+----+ |
| | | | |
| | | +-----+----+--+-------+ |
| | | | # # # |
| | | | 'SUBDOC' 'CDATA' kwd r
| | | | | 'NDATA' | |
| # | | | 'SDATA' +----+
| ps | | | #
| # | | | ps
+-+-+ | | #
| | | name
| | | |
# | | +-+--+
paralit | | | #
| | | | ps
| | | | #
| | | | dso
| | | | #
| | | | attrspecs
| | | | #
| | | | dsc
| | | | #
+---+------+----+-----+----+
|
+-+-+
| #
| ps
| |
+-+-+
#
mdc
CDATA ps paralit
SDATA
PI
STARTTAG
ENDTAG
MS
MD
SYSTEM [ps syslit]
PUBLIC [ps publit [ps syslit]]
SUBDOC
CDATA name [data]
NDATA
SDATA
# paralit
!ENTITY (# / cdata / (system / public) [subdoc / cdata / ndata / sdata])
]PRE]