Существует запутанный способ использования choice
для создания вариантов, в которых разрешены только допустимые комбинации ...
В вашем примере это должно иметь желаемый результат:
<xs:complexType name="Address">
<xs:choice>
<xs:sequence>
<xs:element name="city"/>
<xs:element name="street"/>
<xs:element name="state"/>
</xs:sequence>
<xs:sequence>
<xs:element name="street"/>
<xs:element name="postcode"/>
</xs:sequence>
</xs:choice>
</xs:complexType>
Другойпростой пример, если вы хотите разрешить любые два из трех ... вы можете сделать это, скажем, у вас есть элементы ABC, и вы хотите разрешить любые два из трех, вы можете использовать следующее xsd:
<xs:complexType name="anyTwo">
<xs:choice>
<xs:sequence>
<xs:element name="A"/>
<xs:element name="B"/>
</xs:sequence>
<xs:sequence>
<xs:element name="A"/>
<xs:element name="C"/>
</xs:sequence>
<xs:sequence>
<xs:element name="B"/>
<xs:element name="C"/>
</xs:sequence>
</xs:choice>
</xs:complexType>
Вы можетевидите, что это скоро станет громоздким для больших наборов, но принципал работает!
Редактировать: см. также ответ