確定的スキーマとは、あいまいではないスキーマのことです。このスキーマでは、スキーマ オブジェクト モデル (SOM) で使用されているパーサーは、XML ドキュメントが有効であるために必要な要素のシーケンスを判別できます。XML スキーマは、あいまいに、つまり非確定的にすることもできます。パーサーによる構造解析で、スキーマを使用しても明確に判別できない場合、スキーマは非確定的スキーマと見なされます。非確定的スキーマで検証しようとすると、SOM で使用するパーサーがエラーを生成します。
確定的スキーマ
確定的スキーマでは、パーサーは、インスタンス ドキュメント内で発生する要素の有効な順序をどのように構成するかを、スキーマ内の情報に基づいて判別できます。
次に示すのは、有効なドキュメントに要素 root
を含むことを指定した確定的 XML スキーマです。要素 root
は、要素 apple
と次に要素 berry
、または要素 coffee
と次に要素 dairy
のいずれかを内容として持っています。
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root" type="rootTypes" />
<xs:complexType name="myKitchen">
<xs:choice>
<xs:sequence>
<xs:element name="apple"/>
<xs:element name="berry"/>
</xs:sequence>
<xs:sequence>
<xs:element name="coffee"/>
<xs:element name="dairy"/>
</xs:sequence>
</xs:choice>
</xs:complexType>
</xs:schema>
上のスキーマを使用して、インスタンス ドキュメントの処理中にパーサーがスキーマのロジックを解析できます。ここでは、ドキュメント内で要素 root
の後に要素 apple
が続いている場合、パーサーが検出するのは apple
および berry
のシーケンスの最初の部分です。同様に、パーサーは、要素 root
の検出後に要素 coffee
を検出すると、coffee
および dairy
というシーケンスの最初の部分を検出したと判断します。インスタンス ドキュメント内の要素の順序がこれ以外の場合、特定のスキーマに従って順序は無効となります。
非確定的スキーマ
非確定的スキーマを使用すると、パーサーは処理対象のドキュメント内の要素のシーケンスを判別できません。非確定的 XML スキーマの例を次に示します。
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root" type="rootTypes" />
<xs:complexType name="myKitchen">
<xs:choice>
<xs:sequence>
<xs:element name="apple"/>
<xs:element name="berry"/>
</xs:sequence>
<xs:sequence>
<xs:element name="apple"/>
<xs:element name="coffee"/>
</xs:sequence>
</xs:choice>
</xs:complexType>
</xs:schema>
上の非確定的スキーマを照合してインスタンス ドキュメントを処理しているときに、パーサーは、要素 root
とその次の要素 apple
を検出しても、その後に続く要素を参照しないと、apple
要素が apple
および berry
のシーケンスの最初の部分であるか、apple
および coffee
のシーケンスの最初の部分であるかを判別できません。スキーマ オブジェクト モデル (SOM) で使用されるパーサーは、前方向のチェックを行わないため、非確定的スキーマを使用して検証を行おうとすると、そのパーサーはエラー メッセージ "Content model must be deterministic
" を生成します。