XSD qualsiasi elemento qualsiasi ordine qualsiasi numero di volte
-
02-10-2019 - |
Domanda
Ho provato tutte le <xs:all>, <xs:choice>, and <xs:sequence>
Nessuno di questi aiuta il mio caso in modo soddisfacente.
Qualcuno sa come si dovrebbe convalidare qualcosa di simile.
<Menu>
<SubMenu>
<MenuItem .. />
<MenuItem .. />
<MenuItem .. />
</SubMenu>
<MenuItem .. >
<MenuItem .. >
</Menu>
Dove,
Sotto il tag <Menu>
<SubMenu>
e / o <MenuItem>
possono verificarsi qualsiasi numero di volte (0-n) in qualsiasi ordine.
Ma almeno uno di essi deve avvenire almeno una volta.
Ignorando le convalide all'interno tag sottomenu.
apprezzerebbe alcun aiuto in questa materia.
Soluzione
Se ho capito la vostra esigenza in modo corretto, allora si potrebbe frase il modello come "uno dei sottomenu o MenuItem seguito da zero o più elementi sottomenu o MenuItem". Ciò può essere espresso abbastanza facilmente come una sequenza di due scelte:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- whatever your element needs to be modelled as here -->
<xs:element name="MenuItem">
<xs:complexType>
<xs:attribute name="text"/>
</xs:complexType>
</xs:element>
<!-- only modelling the structure of the child elements here -->
<xs:element name="SubMenu">
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="1" maxOccurs="1">
<xs:element ref="MenuItem"/>
<xs:element ref="SubMenu"/>
</xs:choice>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="MenuItem"/>
<xs:element ref="SubMenu"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Menu">
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="1" maxOccurs="1">
<xs:element ref="MenuItem"/>
<xs:element ref="SubMenu"/>
</xs:choice>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element ref="MenuItem"/>
<xs:element ref="SubMenu"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Si potrebbe modellare il modo più pulito utilizzando un tipo globale condivisa per menu e sottomenu, ma in questo modo è relativamente ovvio che la speranza.