次のXSDコードがあります。
<xsd:complexType name="questions">
<xsd:sequence>
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="pictureInput" type="pictureInput" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
ここでの問題は次のとおりです。要素の場所、multipleChoiceInputなどは、宣言されているのと同じ順序で出現する必要があります。これが発生したくはありません。検証プロセスでは、シーケンスは重要ではありません。どうすればこれを達成できますか?
私が試した別の可能性は次のとおりです:
<xsd:complexType name="questions">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/>
</xsd:choice>
</xsd:complexType>
この例では、シーケンスは本当に重要ではなくなり、必要な要素をいくつでも持つことができます(「すべて」では何ができないか)。しかし、私はまだmin-およびmaxOccursの問題を抱えています。この例では、「pictureInput」をできるだけ多く持つことができますが、これも0または1にしたい制約です。
助けてくれてありがとう!
<xsd:complexType name="questions">
<xsd:all>
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/>
<xsd:element name="textInput" type="textInput"/>
<xsd:element name="pictureInput" type="pictureInput"/>
</xsd:all>
</xsd:complexType>
注:「シーケンス」を「すべて」に変更しました
シーケンスは順序を強制します(定義されているとおり)。順序が関係ない場合は、すべてが使用されます。
要素が複数回出現する可能性がある場合は、xsd:anyを使用できます。
<xsd:complexType name="questions">
<xsd:sequence>
<xsd:any minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
次のリンクでxsd:anyの詳細を確認できます。
私はこの議論に少し遅れましたが、同じ問題があり、解決策を見つけました:
<xsd:complexType name="questions">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/>
<xsd:element name="textInput" type="textInput"/>
<xsd:element name="pictureInput" type="pictureInput"/>
</xsd:choice>
</xsd:complexType>
重要なのは、xs:choiceとmaxOccurs = "unbounded"を組み合わせることです。 xs:allだけを使用する場合は、それぞれ1つずつのピリオドが許可されます。
追加のために編集:xs:anyは機能しますが、選択肢が項目化された4つの要素に制限されることはありません。それは何でも許可しますが、これはスキーマの目的をほとんど無効にします。
ここのパーティーにも非常に遅れていますが、<xsd:all>
とminOccurs
およびmaxOccurs
を併用しても機能しませんか?:
<xsd:complexType name="questions">
<xsd:all>
<xsd:element name="location" type="location" minOccurs="0" maxOccurs="1"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="1"/>
<xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="1"/>
<xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/>
</xsd:all>
</xsd:complexType>