Comment faire des attributs mutuellement exclusifs dans un schéma XML?
Je suis en train de faire deux attributs XML être mutuellement exclusifs. Comment peut-on créer un schéma XSD pour capturer ce genre de scénario?
Je voudrais avoir un de ces
<elem value="1" />
<elem ref="something else" />
mais pas
<elem value="1" ref="something else" />
source d'informationauteur Filip Frącz
Vous devez vous connecter pour publier un commentaire.
Depuis RelaxNG a été mentionné dans Alnitak réponse, voici une solution
avec RelaxNG (une langue qui est, dans la plupart des cas, mieux que le W3C
Le schéma). Notez le " OU " ( | ) dans la définition de l'elem:
Si j'ai ce fichier XML:
Elle est acceptée par rnv et xmlint:
Si j'ajoute dans le fichier XML:
J'obtiens des erreurs de validation, que je veux (notez que les messages d'erreur
sont sous-optimaux):
Vous ne pouvez pas faire avec des attributs, mais vous pouvez le faire avec des éléments d'enfant...
De cette façon, vous pouvez avoir...
ou...
Malheureusement, autant que je sache, vous ne pouvez pas faire cela avec le Schéma de XML, j'ai eu le même problème moi-même.
Je l'ai vu il a suggéré que, si vous avez besoin de:
puis
<elem>
doit lui-même être divisé en deux types, car ils ont clairement obtenu de différents attributs...XSD a résumé types pour cela: http://www.tek-tips.com/viewthread.cfm?qid=1364846 (voir le post de par tsuji)
Fondamentalement, vous donnez l'élément à part un résuméde type complexe et définir ses attributs communs là, qui sont exactement le même pour tous les différents cas d'utilisation (pas besoin de votre exemple).
Ensuite, vous créez des 2 (ou plus) d'autres types complexes qui s'étendent le type abstrait que je viens de mentionner. Dans ces de nouveaux types de définir les différents ensembles d'attributs entre chaque cas d'utilisation. C'est tout pour le XSD partie.
Enfin, vous devez ajouter une XSI
type
attribut de l'élément dans le schéma de l'instance de document. Donc, pour être valide, l'élément doit maintenant avoir un ensemble d'attributs ou de l'autre.Pas simple, mais souple, et comme nous le savons tous: le plus souple, le plus difficile, quelque chose devient.
Pour les lecteurs à venir plus tard sur ce sujet, notez que le problème peut être résolu en XSD 1.1 l'aide de "conditionnel affectation de type" ou des affirmations.
En fait, il est possible de définir ce dans XSD 1.0 en utilisant l'identité des contraintes via xs:unique ou xs:key. Celui que vous choisissez dépend de la façon dont les éléments sans l'un des deux attributs doivent être traités: Ils sont valables avec xs:unique mais pas avec xs:key. L'exemple de code ci-dessous contient les deux variantes; assurez-vous de supprimer l'un d'entre eux, sinon la "strictes" xs:key prend la priorité sur xs:unique, c'est à dire, l'un des deux attributs.
Cela valide le fichier XML suivant: