J'essaie de créer un XSD et j'essaie d'écrire la définition avec l'exigence suivante:
- Autoriser l'élément enfant spécifié à apparaître un nombre illimité de fois (de 0 à illimité)
- Autoriser les éléments enfants à être dans n'importe quel ordre
J'ai regardé autour de moi et j'ai trouvé diverses solutions comme celle-ci :
<xs:element name="foo">
<xsl:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="child1" type="xs:int"/>
<xs:element name="child2" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
Mais d'après ce que je comprends xs: le choix ne permet toujours que la sélection d'un seul élément. Par conséquent, si vous définissez MaxOccurs sur illimité comme ceci, cela signifie uniquement que "n'importe lequel" des éléments enfants peut apparaître plusieurs fois. Est-ce exact?
Si la solution ci-dessus est incorrecte, comment puis-je réaliser ce que j'ai indiqué ci-dessus dans mon exigence?
EDIT : Et si l'exigence est la suivante?
- L'élément enfant1 enfant2 peut apparaître un nombre illimité de fois (de 0 à illimité)
- Les éléments doivent être dans n'importe quel ordre
- Les éléments child3 et child4 doivent apparaître exactement une fois.
Par exemple, ce xml est valide:
<foo>
<child1> value </child1>
<child1> value </child1>
<child3> value </child3>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>
mais ce n'est pas (enfant manquant3)
<foo>
<child1> value </child1>
<child1> value </child1>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>
La formulation alternative de la question ajoutée dans une édition ultérieure semble toujours être sans réponse: comment spécifier que parmi les enfants d'un élément, il doit y en avoir un nommé
child3
, un nomméchild4
, et n'importe quel nombre nomméchild1
ouchild2
, sans contrainte sur l'ordre dans que les enfants apparaissent.Il s'agit d'un langage régulier clairement définissable, et le modèle de contenu dont vous avez besoin est isomorphe à une expression régulière définissant l'ensemble de chaînes dans lequel les chiffres '3' et '4' apparaissent chacun exactement une fois, et les chiffres '1' et '2 'se produisent un certain nombre de fois. Si la manière d'écrire cela n'est pas évidente, il peut être utile de réfléchir au type de machine à états finis que vous construiriez pour reconnaître un tel langage. Il aurait au moins quatre états distincts:
Quel que soit l'état dans lequel se trouve l'automate, «1» et «2» peuvent être lus; ils ne modifient pas l'état de la machine. Dans l'état initial, «3» ou «4» sera également accepté; dans les états intermédiaires, seuls «4» ou «3» sont acceptés; dans l'état final, ni «3» ni «4» ne sont acceptés. La structure de l'expression régulière est la plus facile à comprendre si nous définissons d'abord une expression régulière pour le sous-ensemble de notre langage dans lequel seuls '3' et '4' apparaissent:
Pour permettre à '1' ou '2' de se produire un nombre illimité de fois à un endroit donné, nous pouvons insérer
(1|2)*
(ou[12]*
si notre langage regex accepte cette notation). En insérant cette expression à tous les emplacements disponibles, nous obtenonsTraduire cela en un modèle de contenu est simple. La structure de base est équivalente à l'expression régulière
(34)|(43)
:Insérer un choix zéro ou plus de
child1
etchild2
est simple:Si nous voulons minimiser un peu le volume, nous pouvons définir un groupe nommé pour les choix répétés de
child1
etchild2
:Dans XSD 1.1, certaines des contraintes sur les
all
groupes ont été levées, il est donc possible de définir ce modèle de contenu de manière plus concise:Mais comme on peut le voir d'après les exemples donnés précédemment, ces changements de
all
groupes ne changent pas en fait le pouvoir expressif de la langue; ils ne font que rendre la définition de certains types de langues plus succincte.la source
C'est ce qui a finalement fonctionné pour moi:
la source
Non. Le choix se produit individuellement pour chaque «répétition» de ce
xs:choice
qui se produitmaxOccurs="unbounded"
. Par conséquent, le code que vous avez publié est correct et fera réellement ce que vous voulez tel qu'il est écrit.la source
Vous devriez constater que le schéma suivant autorise ce que vous avez proposé.
Cela vous permettra de créer un fichier tel que:
Ce qui semble correspondre à votre question.
la source
minOccurs
etmaxOccurs
sont limités à 1 pour les enfants dexs:all
.Si rien de ce qui précède ne fonctionne, vous travaillez probablement sur une transaction EDI où vous devez valider votre résultat par rapport à un schéma HIPPA ou à tout autre xsd complexe d'ailleurs. La condition est que, disons qu'il y a 8 segments REF et que l'un d'eux doit apparaître dans n'importe quel ordre et que tous ne sont pas nécessaires, cela signifie que vous pouvez les avoir dans l'ordre suivant 1er REF, 3e REF, 2e REF, 9e REF. Dans la situation par défaut, la réception EDI échouera, car le type complexe par défaut est
La situation est même complexe lorsque vous appelez votre élément par réfraction et que cet élément à son emplacement d'origine est lui-même assez complexe. par exemple:
Solution:
Ici, simplement remplacer «séquence» par «tous» ou utiliser «choix» par des combinaisons min / max ne fonctionnera pas!
Première chose à remplacer
"xs:sequence" with "<xs:all>"
Maintenant, vous devez apporter des modifications à l'endroit d'où vous faites référence à l'élément, allez à:*** Maintenant, dans le segment ci-dessus, ajoutez un point de déclenchement à la fin comme ceci trigger_field = "REF01 _... nom complet .." trigger_value = "38" Faites de même pour les autres segments REF où la valeur de déclenchement sera différente comme par exemple "18 "," XX "," YY "etc. pour que les informations de votre enregistrement ressemblent maintenant à:
b:recordinfo structure="delimited" field.........Biztalk/2003" trigger_field="REF01_...complete name.." trigger_value="38">
Cela rendra chaque élément unique, la raison étant que tous les segments REF (exemple ci-dessus) ont la même structure que REF01, REF02, REF03. Et pendant la validation, la validation de la structure est correcte mais elle ne laisse pas les valeurs se répéter car elle essaie de rechercher les valeurs restantes dans le premier REF lui-même. L'ajout de déclencheurs les rendra tous uniques et ils passeront dans n'importe quel ordre et dans n'importe quel cas de situation (comme utiliser 5 sur 9 et pas tous 9/9).
J'espère que cela vous aidera, car j'ai passé près de 20 heures là-dessus.
Bonne chance
la source