2010-11-08 6 views
9

Je crois que cela a à voir avec keyref mais je ne suis pas sûr, et je ne suis vraiment pas sûr que cela puisse être fait du tout.Restriction des éléments XML basés sur un autre élément via XSD

Par exemple, disons que j'ai myElement1 et myElement2. S'il n'y a pas myElement2 dans le fichier XML, alors myElement1 doit exister, sinon c'est facultatif.

Existe-t-il un moyen de forcer ce type de validation dans mon fichier XSD?

+1

Je suis assez sûr que la réponse n'est pas due à l'ambiguïté: le schéma pour le conteneur de tels éléments aurait deux définitions différentes. La seule solution est de déclarer l'élément "optional/required" comme facultatif et d'utiliser une validation de deuxième phase. –

Répondre

23

Des questions similaires ont été posées à plusieurs reprises .. dans stackoverflow ou de blog tech ..

mais la réponse est toujours pas possible,


cas comme:

(un) élément de validation dépendant de la valeur ou de la présence de tout autre élément/attribut
(b) validation de la valeur d'un élément en fonction de la valeur ou de la présence de tout autre élément/attribut
(c) la validation de l'attribut en fonction de la valeur ou de la présence de tout autre élément/attribut
(d) la définition des éléments/attributs de même nom ayant différents types/DataTypes sous même portée
(e) valider les éléments enfants sur la base de la valeur ou de la présence de tous les autres éléments/attributs

tous les cas mentionnés ci-dessus ne sont pas possibles pour atteindre ..

mais si vous pouvez mettre en œuvre quelque chose de transformation .. alors vous pouvez obtenir de l'aide. ce que je veux dire est "d'abord passer par la transformation et modifier le XML selon vos besoins,

exemple :: si le champ particulier est prévu avec une certaine valeur .. passer le XML tel qu'il est si la condition est satisfaite et ne pas passer si ce n'est pas le cas dans le prochain bloc XSD va valider et évidemment des erreurs :) vous pouvez comprendre qu'il manque votre validation personnalisée ..

de toute façon l'intention est de bloquer ou Passez le le xml selon les données .. et c'est ce que vous faites ..

Note: Schematron a été mis en bonne pratique récemment! Voici le tutoriel: http://zvon.org/xxl/SchematronTutorial/General/contents.html

+0

Merci pour l'info! J'ai cherché avant de poster mais je n'ai pas vraiment trouvé de réponse. Fondamentalement, j'ai découvert qu'il est impossible de faire juste avec la validation et le schéma. – hmcclungiii

+0

@hmcclungiii, yup c'est le point :) –

+1

Ceci est une paraphrase raisonnablement mais pas complètement exacte de la situation dans XSD 1.0: cas (a), (b), (e), et (f) sont parfois possibles, en fonction de les détails de la contrainte désirée. Et dans XSD 1.1, les caractéristiques de type conditionnel et d'assertion permettent d'exprimer une gamme de contraintes un peu plus large. –

1

Ce que je suggère est de créer XSD pour chaque cas définis ci-dessous:

cas comme:

  1. Validating élément en fonction de la valeur ou de la présence de tout autre élément/attribut.
  2. Validation de la valeur d'un élément en fonction de la valeur ou de la présence de tout autre élément/attribut.
  3. Validation de l'attribut en fonction de la valeur ou de la présence de tout autre élément/attribut.
  4. Ignorer les éléments/attributs (aléatoires) de la validation n'est pas autorisé. (Je veux dire que l'utilisation de a des restrictions.
  5. Eléments/attributs de même nom ayant des types de données différents.
  6. Validation des éléments enfants sur la base de la valeur ou de la présence de tout autre élément/attribut.

Et créer leur propre XML pour cela.

Questions connexes