No momento, estou escrevendo um SDK em torno de um padrão xml bem antigo e complicado. Há um esquema xml fornecido e estou confuso com esta construção:
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:choice>
<xs:element ref="A" minOccurs="0" />
<xs:element ref="B" />
</xs:choice>
<xs:element ref="C" minOccurs="0" maxOccurs="unbounded" />
<xs:element ref="D" minOccurs="0" maxOccurs="unbounded" />
</xs:choice>
</xs:complexType>
Não tenho a mínima ideia de como entender isso... especialmente a escolha interna. Então escolha significa pegar exatamente um elemento dos listados, certo? Mas B não tem min ou max ocorrendo, então o padrão é 1. Então exatamente 1 elemento de B é necessário. Como escolher A então?
Acho que a escolha interna é basicamente sem sentido. O modelo de conteúdo permite qualquer número de elementos, cada um dos quais pode ser um A, um B, um C ou um D, e eles podem estar em qualquer ordem. Existem maneiras mais simples de expressar isso.
Como Michael disse, você poderia simplesmente usar uma estrutura como a abaixo e ela validaria a mesma estrutura.
Se você quiser impor pelo menos um elemento, defina o minOccurs na escolha como 1.
Observação: defini os elementos inline como string em vez de uma referência, pois você não forneceu essa parte do esquema.
Como alternativa ao uso de um,
choice
você pode usar umsequence
e, então, você realmente tem que tornar os elementosminOccurs
0, o que você não precisa com ochoice