Construction de schéma XML pour "un ou plusieurs de ces éléments mais doit être au moins un"

StackOverflow https://stackoverflow.com/questions/100228

  •  01-07-2019
  •  | 
  •  

Question

J'essaie de configurer une partie d'un schéma qui ressemble à une "séquence". où tous les éléments enfants sont facultatifs, mais au moins un des éléments doit être présent, et il peut y en avoir plusieurs.

J'ai essayé de procéder comme suit, mais XMLSpy se plaint que "le modèle de contenu contient les éléments < élément name =" " DateConstant "> et < nom d'élément = " DateConstant " > qui ne peut pas être déterminé de manière unique. ":

    <xs:choice>
        <xs:sequence>
            <xs:element name="DateConstant"/>
            <xs:element name="TimeConstant"/>
        </xs:sequence>
        <xs:element name="DateConstant"/>
        <xs:element name="TimeConstant"/>
    </xs:choice>

Cela peut-il être fait (et si oui, comment)?

Quelques précisions: Je veux seulement permettre un élément de chaque élément du même nom. Il peut y avoir un " DateConstant " et / ou un "TimeConstant", mais pas deux des deux. La réponse de Gizmo correspond à mes exigences, mais elle est impossible pour un plus grand nombre d'éléments. La réponse de Hurst autorise deux éléments ou plus du même nom, ce que je ne souhaite pas.

Était-ce utile?

La solution

Essayez ceci:

<xs:choice>
  <xs:sequence>
    <xs:element name="Elem1" />
    <xs:element name="Elem2" minOccurs="0" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:sequence>
    <xs:element name="Elem2" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:element name="Elem3" />
</xs:choice>

Ce faisant, vous forcez le choix du premier élément, le reste est facultatif, le deuxième élément et le reste, le troisième.

Cela devrait faire ce que vous voulez, j'espère.

Vous pouvez bien sûr placer les sous-séquences en groupes afin d'éviter de dupliquer un élément de chaque séquence si vous réalisez que vous en manquez un.

Autres conseils

Selon l'article technique sur MSDN intitulé Présentation du schéma XML . sur http://msdn.microsoft.com /en-us/library/aa468557.aspx#understandxsd_topic5 vous pouvez tirer parti de contraintes telles que minOccurs sur la définition de choix (compositeur) elle-même:

"L'utilisation de contraintes d'occurrence sur un compositeur s'applique à l'ensemble du groupe dans son ensemble"

(voir l'exemple plus sophistiqué qui utilise des types complexes imbriqués et l'exemple AuthorType)

Vous avez indiqué que votre exigence était "au moins un des éléments devait être présent, et il pourrait y en avoir plus d'un". Ainsi, je vous propose d'essayer ce qui suit:

<xs:choice minOccurs="1" maxOccurs="unbounded">
    <xs:element name="DateConstant" type="..."/>
    <xs:element name="TimeConstant" type="..."/>
</xs:choice>

@hurst,

Malheureusement, vous n'avez pas compris la question initiale. Placer minOccurs = " 1 " sur le choix est satisfait automatiquement lorsque TOUS les éléments qui ont minOccurs = " 0 " sont contenus en tant qu'options.

Ainsi, vous n'avez pas réussi à prendre en compte le " au moins un " requis par l’affiche originale, car aucun élément ne satisfait correctement une occurrence de deux éléments complètement facultatifs.

Jusqu'à présent, je suis incapable de trouver une solution à ce problème car minOccur / maxOccur se rapportent tous les deux au groupe dans lequel ils sont définis et NE SONT PAS liés à un nombre total de nœuds. Vous ne pouvez pas non plus utiliser l'élément choice pour définir le même élément nommé plus d'une fois, sinon il devient "ambigu". J'ai vu des exemples utiliser des références au lieu d'éléments d'un type spécifique, mais je pense que cela échoue avec l'analyseur XSD de Microsoft.

<xs:choice minOccurs="1" maxOccurs="1">
  <xs:sequence minOccurs="1" maxOccurs="1">
    <xs:element name="Elem1" minOccurs="1" maxOccurs="1" />
    <xs:element name="Elem2" minOccurs="0" maxOccurs="1" />
  </xs:sequence>
  <xs:sequence >
    <xs:element name="Elem2" minOccurs="1" maxOccurs="1" />
  </xs:sequence>
</xs:choice>

Ici vous pouvez voir que vous avez soit la première séquence (qui DOIT avoir Elem1 mais peut avoir Elem2 en option), soit vous avez la deuxième séquence (qui DOIT avoir Elem2).

Vous avez donc désormais " un ou plusieurs " de ces 2 éléments. Bien entendu, plus vous avez d'options, plus vous avez d'options à offrir, plus le nombre d'options possibles pour toutes les combinaisons possibles est complexe.

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