[1] > :[DFN[[RUBY[妥当性制約] [だとうせいせいやく] @en[validity constraint]]]]: [定義: すべての[[妥当]]な[[XML文書]]に適用される規則。[[妥当性制約]]への違反は[[誤り]]とする。[[妥当性]]を[[検証]]する[[XML]][[処理器]]は、[[利用者の任意選択]]により、これを報告しなければ'''ならない'''。] ;; 出典: , ,名前 ,対象 ,>>2 ,[[根要素型]] ,[[文書実体]] ,>>3 ,[[宣言]]・[[引数実体]]が適切に入れ子になっていること ,[[DTD]] ,>>4 ,[[単独文書宣言]] ,[[文書実体]] ,>>5 ,[[要素妥当]] ,[[文書実現値]] ,>>6 ,[[属性値型]] ,[[文書実現値]] ,>>7 ,一意な[[要素型宣言]] ,[[DTD]] ,>>8 ,[[群]]・[[引数実体]]が適切に入れ子になっていること ,[[DTD]] ,>>9 ,[[型]]重複なし ,[[DTD]] ,>>10 ,[[識別子]] ,[[文書実現値]] ,>>11 ,1[[要素型]]1[[識別子]] ,[[DTD]] ,>>12 ,[[識別子属性]][[既定値]] ,[[DTD]] ,>>13 ,[[識別子参照]] ,[[文書実現値]] ,>>14 ,[[実体名]] ,[[文書実現値]] ,>>16 ,[[名前字句]] ,[[文書実現値]] ,>>17 ,[[記法属性]] ,[[文書実現値]] ,>>18 ,1[[要素型]]1[[記法]] ,[[DTD]] ,>>19 ,[[空要素]][[記法]]なし ,[[DTD]] ,>>35 ,重複[[字句]]なし ,[[DTD]] ,>>20 ,[[列挙]] ,[[文書実現値]] ,>>21 ,[[必須属性]] ,[[文書実現値]] ,>>22 ,[[属性]][既定値]]が[[構文]]的に正しいこと ,[[DTD]] ,>>23 ,[[固定属性]][[既定値]] ,[[文書実現値]] ,>>25 ,[[条件区間]]・[[引数実体]]が適切に入れ子になっていること ,[[DTD]] ,>>26 ,[[実体]]が[[宣言]]されていること ,[[文書実現値]]・[[DTD]] ,>>27 ,[[記法]]が[[宣言]]されていること ,[[DTD]] ,>>28 ,一意な[[記法名]] ,[[DTD]] ,>>37 ,[DEL[[[妥当]]な[CODE(XMLa)@en[[[xml]]:[[lang]]]]]],[[文書実現値]] - [2] [根要素型]: [[文書型宣言]]中の [CODE(XML)[Name]] は、[[根要素]]の[[要素型]]と一致しなければならない。 () - [3] [宣言及びパラメーター実体の入れ子適当性]: [[パラメーター実体]]の[[置換文]]は[[マーク宣言]]で適切に入れ子となっていなければならない。つまり、マーク宣言の最初又は最後のいずれかの文字がパラメーター実体参照の置換文に含まれていたなら、その両方が同じ置換文中に含まれていなければならない。 () - [4] [非依存文書宣言]: == 属性値に既定値が指定されていて、その要素型が文書中で使われており、かつその属性の値が指定されていないものがある場合、 == [[実体]] [WEAK[([CODE(XML)[apos]], [CODE(XML)[lt]], [CODE(XML)[gt]], [CODE(XML)[quot]], [CODE(XML)[apos]] を除く。)]] への[[参照]]が文書中にある場合、 == [[正規化]]の対象となる値を取る属性があって、その文書中で正規化の結果変化する値が使われている場合、 --- 訂正: 正規化の対象となる値を取る属性があって、その文書中で正規化の結果、[INS[宣言がなかった場合と]]変化する値が使われている場合 == [[要素内容]]を持つ要素型で、その要素型の[[実現値]]の中に直接[[空白間隔]]を持つものがある場合、 -- のいずれかを満たす宣言を外部マーク宣言が持つ時に、[[非依存文書宣言]] [WEAK[([CODE(XML)[standalone]])]] の値は [CODE(XML)[no]] でなければならない。 - [5] [要素妥当]: 要素は、名前が一致する [[ELEMENT]] 宣言があり、その[[内容モデル]]と実際の内容が一致する (詳しくは仕様書参照)。[[混合内容]]で''ない''時に子要素間に挿入可能な [CODE(XML)[S]] を [[CDATA]] [[マーク区間]]とすることは''できない''のに注意。 - [6] [属性値の型]: 属性は宣言されていなければならない。その値はその宣言された型でなければならない。 - [7] [要素型宣言の一意性]: 要素型は複数回宣言することは出来ない。 - [8] [集団及びパラメーター実体の入れ子適当性]: 要素型宣言の内容モデルの部分のパラメーター実体は、括弧について適当に入れ子になっていなければならない。つまり、開き括弧と閉じ括弧の一方がある実体の参照の置換文に含まれるなら、他者も含まれなければならない。 - [9] [(混合内容における) 要素型の重複の禁止]: 1つの混合内容宣言で同じ要素型が複数出現してはならない。 - [10] [ID]: [CODE(XML)[ID]] 型の属性の値は生成規則 [CODE(XML)[Name]] に一致しなければならない。その値は1つの文書中で複数回出現してはならない。 - [11] [一要素一 ID]: 一つの要素に複数個の [CODE(XML)[ID]] 型の属性は置けない。 - [12] [ID 属性の既定値]: [CODE(XML)[ID]] 型の属性の既定値宣言は [CODE(XML)[#IMPLIED]] 又は [CODE(XML)[#REQUIRED]] でなければならない。 ([CODE(XML)[ID]] 型属性の既定値は指定できない。) - [13] [IDREF]: [CODE(XML)[ID]] 型の属性の値は生成規則 [CODE(XML)[Name]] に、 [CODE(XML)[IDREFS]] 型の値は [CODE(XML)[Names]] に一致しなければならない。各 [CODE(XML)[Name]] はその文書中のどれかの要素の [CODE(XML)[ID]] 型属性の値と一致していなければならない。 - [14] [実体名]: ENTITY 型の属性の値は生成規則 Name に、 ENTITIES 型の値は Names に一致しなければならない。各 Name は [[DTD]] で宣言された[[非解析実体]]の [CODE(XML)[Name]] と一致していなければならない。 - [15] - [16] [名前字句]: [CODE(XML)[NMTOKEN]] 型の値は生成規則 [CODE(XML)[Nmtoken]], [CODE(XML)[NMTOKENS]] 型の値は [CODE(XML)[Nmtokens]] に一致していなければならない。 - [17] [記法属性]: 記法 ([CODE(XML)[NOTATION]]) 型の属性の値は(属性)宣言に含まれる記法名のいずれかと一致していなければならない。全ての記法名は宣言されていなければならない。 - [18] [一要素一記法]: 一つの要素に複数個の [CODE(XML)[NOTATION]] 型属性は存在できない。 - [19] [(強制)空要素に記法なし]: [[互換性のため]]、 [CODE(XML)[EMPTY]] と宣言された要素に [CODE(XML)[NOTATION]] 型の属性は存在できない。 - [20] [列挙]: この型の属性の値は宣言された [CODE(XML)[Nmtoken]] 値の一つと一致しなければならない。 - [21] [必須属性]: 既定値宣言が鍵言葉 [CODE(XML)[#REQUIRED]] である場合、その要素型の要素は全てその属性を指定されていなければならない。 - [22] [属性既定値の構文的な正しさ]: 宣言した既定値は宣言した型に照らして正当でなければならない。 -- [34] なお、この検査は''構文的''正しさのみであり、他の点は検討しない。例えば [CODE(XML)[ENTITY]] 型の属性値でその既定値の名前を持つ外部非解析実体が宣言されているかは、属性の既定値が実際に使われる (補完される) ときに初めて検証される。 - [23] [固定属性既定値]: 既定値宣言に鍵言葉 [CODE(XML)[#FIXED]] がある場合、その属性の全ての実現値はその既定値と一致していなければならない。 - [25] [条件区間及び引数実体の入れ子適当性]: [[条件区間]]の [CODE(XML)[ ]] のいずれかが引数実体参照の置換文に含まれる場合、他の全てが同じ置換文に含まれていなければならない。 - [26] [実体が宣言されていること]: 属性は全て宣言されていなければなりません。[[相互運用性のため]]、 [CODE(XML)[amp]] なども宣言するべきです。引数実体は参照される前に、一般実体は直接又は間接に属性の既定値の宣言で参照される前に宣言されていなければなりません。 (詳しくは仕様書参照。) - [27] [記法が宣言されていること]: (実体宣言の記法の) [CODE(XML)[Name]] は記法名と一致しなければなりません。 -- [39] >>27 記法宣言は実体宣言の前にある必要はあるんだろうか? ないんだろうか? -- >>39 [[記法]>>4]参照。 - [28] [記法名の一意性]: 同じ名前の記法を複数宣言できません。 - [32] >>9 訂正: 内容モデルで同じ要素型が複数回一致することを許す場合 - [33] >>5 訂正 にも注意。特に、混合でない子要素の内容モデルの場合、''生の値''が空白間隔である[[文字参照]]である実体への参照 (置換文は文字参照ではなく生の文字になる。) は使えても、''置換文''が文字参照である実体参照は使えないのに注意。 - [35] [(列挙・記法名の)字句の重複無し]: 単一の [CODE(XML)[NotationType]] 属性宣言の記法名や単一の [CODE(XML)[Enumeration]] 属性宣言の [CODE(XML)[Nmtoken]] は、全て異なるものでなければなりません。 - [37] [妥当な [CODE(XML)[[[xml:lang]]]]] ('''削除済み制約''') [CODE(XML)[[[xml]]:[[lang]]]] 属性の値は、 [CODE(XML)[[[NMTOKEN]]]] として正規化した後に、生成規則 [33] に一致しなければならない。 ([[FE]] errata E31 で追加, E73 で [WEAK[(明記されていないものの)]] 削除。[WEAK[削除理由は、 「XML 処理系の立ち入るべき水準ではない」。]]) -- ちなみに [CODE(XML)[xml:lang]] 属性は、 SE の errata で [CODE(XML)[[[CDATA]]]] に修正されてます。 - [40] >>28 [[TE]] で文言修正。「ある名前は複数回記法宣言で宣言しては'''なりません'''。」 [41] [[XML文書]]の条件は[[整形式]]たることですから、[[妥当性制約]]が満たされないとしても、[[XML文書]]たりえます。ただし、[[妥当性制約]]への違反は[[誤り]]です (>>1) から、処理した結果は未定義です。 [42] >>41 ということは、例えば[[妥当]]でない[[要素]]が出てきたらそこで処理終了しても構わないということになります。[[妥当性検証]]を行う[[処理器]]なら普通な動作ですが、行わない[[処理器]]でもそうしてもいい、と。 (例えば[[要素内容]]の検証はしないけど[[強制空要素]]の検証はする、とか。) [43] >>3,>>8,>>25 の[[引数実体]]との入れ子に関する制約も[[妥当性制約]]ということは、入れ子関係がおかしくても[[整形式]]たり得るということだ。正しく処理される保証はないだけで。 ;; でも >>3 は[[生成規則]]を満たしつつ違反するのは無理だろう。 [[妥当性検証]]はしない[[処理器]]でも、これくらいの[[誤り]]の検出はしておいた方が実装が楽かもしれない (し、そうでないかもしれない)。 [44] [[SGML]]互換性のために[Q[属性値の列挙の群と引数実体が適当に入れ子になっていること]]という条件が必要なような。。。 ;; ;; >>8 は[[モデル群]]しかカバーしていない。 ([[名無しさん]]) [[#comment]] * 処理系と妥当性制約 [29] [[妥当性を検証する]]処理系は、利用者の任意選択により、 DTD の宣言により表現された制約への違反及び XML 仕様書の妥当性制約への違反を報告しなければなりません。 この条件を満たすため、妥当性を検証する処理系は DTD 全体と全ての外部解析実体を読まなければなりません。 [36] 妥当性制約は[[XML//整形式制約]]に加えての追加の制約です。 XML 文書は必ずしも妥当性制約を満たしている必要はありませんが、 できるなら満たすことが望ましいでしょう。特に、宣言の完全性 (DTD で定義されていること) 以外の制約は必ず満たすべきです。 [[#comment]] * メモ