Come dichiarare il caso dello schema XML speciale (XSD)
Domanda
Ho bisogno del tuo aiuto per definire un caso speciale nello schema XML: Una sequenza che contiene due elementi: 'x' e 'y' mentre:
-
L'elemento
-
<x>
può apparire da 0 a tempi non associati nella sequenza
L'elemento -
<y>
può apparire 0 a 1 volta nella sequenza
Le -
<=> e <=> posizioni possono essere ovunque - vale a dire, è possibile avere volte non associate l'elemento <=> e quindi un singolo <=> elemento, quindi volte non associate le <=> elemento.
Esempi XML di questo problema:
Esempio n. 1
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>
Esempio n. 2
<y>stuff</y>
<x>stuff</x>
<x>stuff</x>
Esempio n. 3
<x>stuff</x>
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>
Grazie!
Soluzione
Per vari motivi, nessuno dei campioni di Yuval, Mo o davidsheldon funziona. Eccone uno lo fa.
<xs:complexType name="myComplexType">
<xs:sequence>
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:sequence minOccurs="0">
<xs:element name="y" type="xs:string"/>
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:sequence>
</xs:complexType>
Altri suggerimenti
EDIT: come ha detto Alohci, la mia soluzione non è corretta. Secondo le specifiche, un elemento in xs: tutto può apparire solo zero o una volta. Ci scusiamo per l'inconveniente
Penso che ciò che vuoi non sia una sequenza. Una sequenza definisce non solo gli elementi ma anche l'ordine. E nel tuo caso l'ordine potrebbe cambiare. Hai provato xs: all?
<xs:complexType name="myComplexType">
<xs:all>
<xs:element name="x" type="xs:string" maxOccurs="unbounded"/>
<xs:element name="y" type="xs:string" maxOccurs="1"/>
</xs:all>
</xs:complexType>
Un'altra valutazione potrebbe essere quella di renderla una sequenza ma contrassegnare la sequenza come maxOccurs="unbounded"
È da un po 'che non uso schema, ma penso che le sequenze siano la tua risposta qui.
Devi avere un numero illimitato di scelte tra (una x) o (una y seguita da una x).
<xsd:element name="parent">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="x" type="xs:string"/>
<xsd:sequence>
<xsd:element name="y" type="xsd:string" />
<xsd:element name="x" type="xsd:string" />
</xsd:sequence>
</xsd:choice>
</xsd:complexType>
</xsd:element>
Non troppo complicato. In cima alla mia testa, dovrebbe essere qualcosa del genere:
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="y" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
Poiché ogni elemento in XSD è opzionale per impostazione predefinita, questo XSD corrisponderà alla struttura XML che hai definito, con l'elemento y
che appare ovunque prima, dopo o tra gli x
elementi, con una ricorrenza massima di 1