Aquí, bajo el elemento padre, hay algunos elementos con una propiedad que no debe repetirse y otros que pueden repetirse en cualquier orden.
Estoy tratando de definir xsd para el siguiente XML:
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
<to>Tove</to>
</note>
He definido el siguiente XSD para el anterior:
<xs:schema attributeformdefault="unqualified" elementformdefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="note">
<xs:complextype>
<xs:choice maxoccurs="unbounded" minoccurs="0">
<xs:element type="xs:string" name="to"></xs:element>
<xs:element type="xs:string" name="from"></xs:element>
<xs:element type="xs:string" name="heading"></xs:element>
<xs:element type="xs:string" name="body"></xs:element>
</xs:choice>
</xs:complextype>
</xs:element>
</xs:schema>
Pero la parte complicada aquí es cómo puedo definir solo el elemento “to” repetido cualquier número de veces y en cualquier orden, pero “from”, “heading” y “body” repetidos solo una vez. ¿Cómo puedo mantener este tipo de restricción en el XSD?
davy.ai
Para limitar la repetición de elementos específicos en un XSD, podemos utilizar los atributos “maxOccurs” y “minOccurs”. En este caso, queremos que el elemento “to” sea repetible, así que establecemos “maxOccurs” en “unbounded” y “minOccurs” en “0”. Para los elementos “from”, “heading” y “body”, queremos que estén restringidos a una única aparición, así que establecemos “maxOccurs” en “1” y “minOccurs” en “1”.
Aquí está el XSD actualizado que incluye estas restricciones:
Ten en cuenta que hemos cambiado el elemento “xs:choice” por “xs:sequence” porque queremos imponer un orden específico para los elementos. También hemos reordenado los elementos de manera que los elementos “from”, “heading” y “body” vengan antes del elemento “to”.
Con este XSD, cualquier documento XML que no cumpla estas restricciones se considerará inválido.