「これらの要素のいずれか 1 つ以上、ただし少なくとも 1 つである必要がある」の XML スキーマ構造
質問
すべての子要素がオプションである「シーケンス」のようなスキーマの一部を設定しようとしていますが、少なくとも 1 つの要素は しなければならない それらが複数存在する可能性があります。
次のことを実行しようとしましたが、XMLSpy は「コンテンツ モデルには、一意に決定できない要素 <element name="DateConstant"> および <element name="DateConstant"> が含まれています。」と不平を言います。
<xs:choice>
<xs:sequence>
<xs:element name="DateConstant"/>
<xs:element name="TimeConstant"/>
</xs:sequence>
<xs:element name="DateConstant"/>
<xs:element name="TimeConstant"/>
</xs:choice>
これは可能ですか (可能であれば、その方法も)。
いくつかの説明:同じ名前の各要素を 1 つだけ許可したいと考えています。「DateConstant」および/または「TimeConstant」は 1 つだけ存在できますが、どちらも 2 つ存在することはできません。Gizmo の答えは私の要件と一致しますが、要素の数が多い場合は実用的ではありません。ハーストの答えでは、同じ名前の2つ以上の要素が許可されていますが、これは望ましくありません。
解決
これを試して:
<xs:choice>
<xs:sequence>
<xs:element name="Elem1" />
<xs:element name="Elem2" minOccurs="0" />
<xs:element name="Elem3" minOccurs="0" />
</xs:sequence>
<xs:sequence>
<xs:element name="Elem2" />
<xs:element name="Elem3" minOccurs="0" />
</xs:sequence>
<xs:element name="Elem3" />
</xs:choice>
そうすることで、最初の要素を選択して残りをオプションにするか、2 番目の要素と残りをオプションにするか、3 番目の要素を選択するかを強制します。
これで希望どおりのことができるはずです。
もちろん、サブシーケンスをグループに配置して、各シーケンス内の要素を見逃していることに気づいた場合にその要素が重複することを避けることもできます。
他のヒント
MSDN の技術記事によると、次のタイトルが付けられています。 XML スキーマを理解するで http://msdn.microsoft.com/en-us/library/aa468557.aspx# Understandxsd_topic5などの制約を利用できます。 分発生 選択定義 (コンポジター) 自体について:
「コンポジタで出現制約を使用すると、グループ全体に全体として適用されます」
(ネストされた複合型を使用するより洗練された例と AuthorType の例を参照してください)
あなたは要件を「少なくとも 1 つの要素が存在する必要があり、複数存在する可能性がある」と述べました。したがって、次のことを試してみることをお勧めします。
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="DateConstant" type="..."/>
<xs:element name="TimeConstant" type="..."/>
</xs:choice>
@ハースト、
残念ながら、あなたは元の質問を理解できていません。minOccurs="0" を持つすべての要素がオプションとして含まれている場合、選択肢に minOccurs="1" を設定すると、自動的に満たされます。
したがって、完全にオプションの 2 つの要素の出現を正しく満たす要素がないため、元の投稿者が要求する「少なくとも 1 つ」を考慮できませんでした。
minOccur/maxOccur はどちらも定義されているグループに関連しており、ノードの全体数には関連していないため、これまでのところ、これに対する解決策を見つけることができません。また、choice 要素を使用して同じ名前の要素を複数回定義することもできません。そうしないと、「曖昧」になります。特定のタイプの要素の代わりに参照を使用する例をいくつか見たことがありますが、これは Microsoft XSD パーサーに失敗すると思います。
<xs:choice minOccurs="1" maxOccurs="1">
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="Elem1" minOccurs="1" maxOccurs="1" />
<xs:element name="Elem2" minOccurs="0" maxOccurs="1" />
</xs:sequence>
<xs:sequence >
<xs:element name="Elem2" minOccurs="1" maxOccurs="1" />
</xs:sequence>
</xs:choice>
ここでは、最初のシーケンス (Elem1 が必要ですが、オプションで Elem2 が必要) があるか、2 番目のシーケンス (Elem2 が必要) があることがわかります。
したがって、これら 2 つの要素の「いずれか 1 つ以上」が得られます。もちろん、考えられるすべての組み合わせに対して追加の選択肢を提供する必要があるため、オプションが増えれば増えるほど、これは飛躍的に複雑になります。