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!

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top