Question

J'ai besoin de votre aide pour définir un cas particulier dans un schéma XML: Une séquence contenant deux éléments: 'x' et 'y' alors que:

  • <x> L'élément peut apparaître entre 0 et des temps non liés dans la séquence

  • <y> L'élément peut apparaître 0 à 1 fois dans l'ordre

  • <=> et <=> peuvent être situés n'importe où. En d'autres termes, il est possible d'avoir des moments non liés l'élément <=>, puis un seul <=> élément, puis des moments non liés, le <=> élément.

Exemples XML de ce problème:

Exemple n ° 1

<x>stuff</x>
<y>stuff</y>
<x>stuff</x>

Exemple n ° 2

<y>stuff</y>
<x>stuff</x>
<x>stuff</x>

Exemple n ° 3

<x>stuff</x> 
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>

Merci!

Était-ce utile?

La solution

Pour différentes raisons, aucun des échantillons de Yuval, de Mo ou de davidsheldon ne fonctionne. En voici un qui fait.

    <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>

Autres conseils

EDIT: Comme Alohci l’a mentionné, ma solution est incorrecte. Selon la spécification, un élément dans xs: all ne peut apparaître que zéro ou une fois. Désolé pour le dérangement

Je pense que ce que vous voulez n'est pas une séquence. Une séquence définit non seulement les éléments mais également l'ordre. Et dans votre cas, l'ordre peut changer. Avez-vous essayé 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>

Une autre solution pourrait consister à en faire une séquence mais à la marquer comme étant maxOccurs="unbounded"

Cela fait un moment que je n'ai pas utilisé de schéma, mais je pense que les séquences sont votre réponse ici.

Vous devez disposer d'un nombre illimité de choix entre (un x) ou (un y suivi d'un 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>  

Pas trop compliqué. De mémoire, cela devrait ressembler à ceci:

<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"/> 

Etant donné que chaque élément de XSD est facultatif par défaut, ce XSD correspond à la structure XML que vous avez définie, l'élément y apparaissant n'importe où avant, après ou entre les éléments x, avec une occurrence maximale de 1

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top