Esquema XSD con etiquetas obligatorias, opcionales y arbitrarias desordenadas
Estoy tratando de llegar a un esquema XSD 1.0 con las siguientes restricciones:
No hay pedidosAlgunos elementos deben aparecer exactamente una vezAlgunos elementos pueden aparecer cero o tiempos ilimitadosPermitir elementos no reconocidos (no validarlos)La razón de 3. es que me gustaría validar el tipo si el elemento está presente.
Por ejemplo, una persona debe tener exactamente un nombre, una edad opcional (como máximo uno), números de teléfono opcionales (ilimitados) y cualquier otra etiqueta. Estos deberían 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, estos deberíanno 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 es un XSD no válido que captura de una manera comprensible para los humanos lo que estoy tratando de hacer:
<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 no es válido porque no puede tener<any>
debajo de un<all>
y porque XSD 1.0 no te permite tenermaxOccurs="unbounded"
en un<all>
elemento. ¿Alguien sabe cómo se puede lograr esto?