Contrainte unique XSD sur l'attribut des éléments frères d'un type spécifique
J'ai un document XML structuré comme Q&A, qui suit le format suivant (édité pour plus de clarté):
<question>
<answer id="1">
<question>
<answer id="1"/>
<answer id="2"/>
<answer id="3"/>
</question>
</answer>
<answer id="2">
<question>
<answer id="1"/>
<answer id="2"/>
</question>
</answer>
</question>
Mon XSD ressemble à ceci:
<xs:element name="question">
<xs:complexType>
<xs:sequence>
<xs:element name="answer" type="answerType" minOccurs="2" maxOccurs="unbounded">
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="AnswerIdUnique">
<xs:selector xpath="./*" />
<xs:field xpath="@id" />
</xs:unique>
</xs:element>
<xs:complexType name="answerType">
<xs:sequence>
<xs:element ref="question" minOccurs="0" maxOccurs="1" />
</xs:sequence>
<xs:attribute name="id" type="xs:token" use="required" />
</xs:complexType>
Il y a, bien sûr, plus que ce que vous voyez ci-dessus, mais cela illustre mon problème.
J'ai besoin pour le id
attribut sur answer
éléments comme unique parmi les frères et sœurs. Le XSD défini ci-dessus applique l'unicité de id
attributs parmi les éléments frères, mais il ne fait pas de distinction sur le type d'élément. J'ai essayé une variété de sélecteurs et des champs dans la contrainte d'unicité, mais n'ont pas trouvé une combinaison qui fonctionne.
Des suggestions?
source d'informationauteur joelmdev | 2012-04-27
Vous devez vous connecter pour publier un commentaire.
Il suffit de changer le sélecteur de
<xs:selector xpath="answer"/>
et vous serez amende. En général, il est bon d'éviter les requêtes Xpath comme.//*
si seulement pour des raisons de performances.C'est le Schéma XML de l'exemple XML que vous avez à condition que je pense de travail comme vous le souhaitez:
Votre posté XML valide bien avec ce qui précède; la duplication de toute la fratrie réponse de l'id produit une erreur de validation. Par exemple, le code XML suivant:
De validation (en QTAssistant, devrait être similaire à la message dans Visual Studio, car il est basé sur la même technologie), ce sont les erreurs:
Ci-dessous est une capture d'écran à partir de Visual Studio 2010 montrant au-dessus de la validation XML contre le XSD j'ai posté; alors que les problèmes sont, par inadvertance, a rapporté que des avertissements, ils sont néanmoins signalés.
J'ai choisi au hasard un en ligne validateur (http://xsdvalidation.utilities-online.info/) et validé le même XML et XSD j'ai posté; l'erreur est signalée comme:
org.xml.sax.SAXParseException: Duplicate unique value [1] declared for identity constraint of element "question".org.xml.sax.SAXParseException: Duplicate unique value [1] declared for identity constraint of element "question".
Une chose que vous devez faire attention, c'est quand vous avez un espace de noms cible pour votre XSD; dans ce cas, il est nécessaire de définir un alias pour tous les espaces de noms, et de les utiliser dans vos sélecteurs.
Mise à JOUR: Et le XSD avec des espaces de noms:
Veuillez noter que l'introduction de la
tns
préfixe et l'utilisation de l'informatique dans le sélecteur.