Esquema XSD com tags obrigatórias, opcionais e arbitrárias não ordenadas
Estou tentando criar um esquema XSD 1.0 com as seguintes restrições:
Não há pedidosAlguns elementos devem aparecer exatamente uma vezAlguns elementos podem aparecer zero ou vezes sem limitesPermitir elementos não reconhecidos (não os valide)O motivo do 3. é que eu gostaria de validar o tipo se o elemento estiver presente.
Por exemplo, uma pessoa deve ter exatamente um nome, uma idade opcional (no máximo uma), números de telefone opcionais (ilimitados) e qualquer outra etiqueta. Estes devem validar:
<person>
<name>Bob</name>
<age>33</age>
<phone>123456789</phone>
<phone>123456788</phone>
</person>
<person>
<name>Alice</name>
</person>
<person>
<name>John</name>
<!-- unrecognized, arbitrary tags: -->
<location>city</location>
<occupation>laywer</occupation>
</person>
Considerando que essesnão Validar:
<person>
<!-- I am missing a name -->
<phone>123456789</phone>
</person>
<person>
<!-- I should only have one name -->
<name>Sally</name>
<name>Mary</name>
</person>
<person>
<name>Josh</name>
<!-- Phone number is not an int -->
<phone>not a number</phone>
</person>
Este é um XSD inválido que captura de uma maneira compreensível o que estou tentando fazer:
<xs:element name="person">
<xs:complexType>
<xs:all>
<xs:element type="xs:string" name="name" minOccurs="1" maxOccurs="1"/>
<xs:element type="xs:int" name="age" minOccurs="0" maxOccurs="1"/>
<xs:element type="xs:int" name="phone" minOccurs="0" maxOccurs="unbounded"/>
<xs:any />
</xs:all>
</xs:complexType>
</xs:element>
Este XSD é inválido porque você não pode ter<any>
sob um<all>
e porque o XSD 1.0 não permite que você tenhamaxOccurs="unbounded"
em um<all>
elemento. Alguém sabe como isso pode ser feito?