私は、すべての子要素がオプションであるが、少なくとも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 の回答は私の要件を満たしていますが、要素の数が多い場合は実用的ではありません。Hurst の回答では、同じ名前の要素を 2 つ以上許可していますが、これは望ましくありません。
ベストアンサー1
これを試して:
<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 番目の要素のいずれかを選択するように強制されます。
これで望みどおりの結果が得られるといいのですが。
もちろん、サブシーケンスをグループにまとめると、要素が 1 つ足りないことに気付いた場合に、各シーケンスで要素が重複するのを防ぐことができます。