2017-01-05 14 views
0

にこれは私のXMLです:XSDスキーマ、任意の順序

<animals> 
    <cat/> 
    <dog/> 
    <cat/> 
    <cat/> 
</animals> 

<cat/><dog/>要素は任意の順序で行くことができ、それらの数に制限はありません。しかし、少なくとも1つの<cat/>と少なくとも1つの<dog/>があることを確認する必要があります。私のXSDがどのように見えるか理解できません。

<xs:complexType name="animals"> 
    <xs:choice minOccurs="1" maxOccurs="unbounded"> 
    <xs:element name="cat" minOccurs="1" maxOccurs="unbounded"/> 
    <xs:element name="dog" minOccurs="1" maxOccurs="unbounded"/> 
    </xs:choice> 
</xs:complexType> 

<cat/>は、例えば、存在しないとき、それはすべてのエラーを表示しません:

これは私が試したものです。 XSD 1.1で

+0

これが役立つかどうかを確認する:https://stackoverflow.com/questions/19863952/xml-schema-maxoccurs-within-choice-element/19871075一般的には、リンクの答えに示すように 'xs:all'グループを使うか、' xs:sequence'と 'xs:choice'の組み合わせを使うことができます。 – Meyer

+0

@マイヤー私はそれを試みたが、私の特定の場合に何をすべきかまだ分かりません。私の例としてXSDを投稿できますか? – yegor256

+0

xsd 1.1を使用できますか? – Kachna

答えて

1

、それはのように単純でなければなりません:XSD 1.0で

<xs:complexType name="animals"> 
    <xs:all> 
    <xs:element name="cat" minOccurs="1" maxOccurs="unbounded"/> 
    <xs:element name="dog" minOccurs="1" maxOccurs="unbounded"/> 
    </xs:all> 
</xs:complexType> 

、それは少しトリッキー取得します。 しかし、有効な のシーケンス<animals>は、<cat>または<dog>要素で始まる必要があります。 最初の要素は繰り返される可能性がありますが、一方の点では はもう一方の要素の最初のインスタンスである必要があります。 これにより、2つの可能なシーケンスの選択肢が得られます。我々は、少なくとも1つの<cat>と1 <dog>要素があることを保証した後 、 追加要素の数に制限はありません。より複雑な要素タイプでは

<xs:complexType name="animals"> 
    <xs:sequence> 
    <xs:choice> 
     <!-- At least one <cat> followed by one <dog> --> 
     <xs:sequence> 
     <xs:element name="cat" maxOccurs="unbounded"/> 
     <xs:element name="dog"/> 
     </xs:sequence> 
     <!-- At least one <dog> followed by one <cat> --> 
     <xs:sequence> 
     <xs:element name="dog" maxOccurs="unbounded"/> 
     <xs:element name="cat"/> 
     </xs:sequence> 
    </xs:choice> 
    <!-- Any remaining number of <cat> and <dog> --> 
    <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <xs:element name="cat"/> 
     <xs:element name="dog"/> 
    </xs:choice> 
    </xs:sequence> 
</xs:complexType> 

、かつての要素を宣言することをお勧めします、 複合型で<xs:element ref="elementName"/>を使用します。

関連する問題