#?SuikaWiki/0.9 [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)[]] のような記述となります。 [11] SGML [[文書実体]]で参照されるほとんどの実体は実体宣言で宣言されているものです。[WEAK[その例外は、[[文書型宣言]]の[[外部部分集合]]とか、[[連結型宣言]]の外部部分集合とか、幾つかあるにはあります。]] [15] 実体名の [CODE(SGML)[pero]] 辺りは[[認知]]の特例になっています。 本来 [CODE(SGML)[pero]] は文脈上の制約があって、 直後に[[名前文字]]などが続く場合のみ認知しますが、 ここでは特別に制約なしで[[区切子]]として認知します。また、 その直後の [CODE(SGML)[ps]] は必須です。これによって、 [[引数実体参照]]と区別しています。 [17] Web SGML では、[[外部引数実体]]に[[記法名]]を指定することで[[DTDデータ実体]]を参照させることができます。 (K.4.10.2 参照) [[#comment]] *同じ名前に対する複数個の実体宣言 [3] [[XML]] 仕様書 曰く: > 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)[]] は[[致命的誤り]]となるはずです。 [6] [[非解析実体]]が参照されている場合: [SAMP(XML)[]]。 妥当性制約「記法が宣言されていること」 は、 「The Name must match the declared name of a notation.」 ([CODE(XML)[[[Name]]]] は宣言された記法の名前に一致しなければならない。) と述べています。状況についての言及はなく、構文についてのみの言及ですから、 この妥当性制約は無視される場合も有効と思われます。 続き (記法がらみ) は[[記法]>>3]辺りへ。 [7] [[文書]]全体の整形式性について、 は、 - 文書全体として [CODE(XML)[[[Document]]]] に一致すること。 - すべての[[XML//整形式制約]]を満たすこと。 - 直接または間接に''参照している''すべての実体が整形式であること。 と言っています。無視されている実体 (であったであろうもの) が参照されていないことは明らかです。 (無視されていなくても、 文書中で参照されていなければ整形式でなくてもいいようです。) [8] 実体についての制限のほとんどは[[置換文]]が対象だから、 無視された宣言や参照されていない実体の宣言はあんまり制約されないのかな。 [9] [[実体参照//解決]>>26]に言及がある仕様の修正は重要。この修正がないと、非解析実体への参照がないか無視された宣言や参照されていない実体の宣言もチェックしないといけなかった。 [10] >>9 しかし他にも問題はある。 XML 名前空間の仕様 曰く: > 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)[ ]] ってのは高々警告で済ませるべきものですよねぇ。今の [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]