2010-12-01 7 views
6

Je possède ce fichier Xml:xsd: unique avec option attributs

<objects> 
    <object name="ID1" /> 
    <object name="ID2" /> 
    <object name="ID2" color="green" /> 
    <object name="ID3" color="green" /> 
<objects> 

Je voudrais valider ce rapport à un schéma XSD, de sorte que la combinaison entre name et color sont uniques dans le document.

Le problème est que, si je l'utilise:

<xs:unique name="UniqueObjectNameColor"> 
    <xs:selector xpath="./object" /> 
    <xs:field xpath="@name" /> 
    <xs:field xpath="@color" /> 
</xs:unique> 

... la règle ignorera object éléments sans l'attribut color en option. Ce qui suit valide correctement alors qu'il ne devrait pas.

<object name="ID2" /> 
    <object name="ID2" /> 

Pouvez-vous me dire comment puis-je spécifier une règle qui impose name uniques et color combinaisons et, lorsque l'attribut color n'est pas présent dans l'élément object, il vérifie la name?

+0

Je voudrais savoir la même chose. La forme de réponse micfra ne le coupe pas tout à fait. –

+2

Il peut casser votre schéma, mais en définissant une valeur par défaut pour l'attribut de couleur help? par exemple.

+0

@MattyK qui a résolu ce problème pour moi. Merci beaucoup! – RichardTowers

Répondre

0

Vieille question, mais vaut la peine d'être répondu. Vous pouvez utiliser plus d'une contrainte unique par élément. Cela ferait ce que vous voulez:

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/xsdunique-with-optional-properties" 
    xmlns:tns="http://www.example.org/xsdunique-with-optional-properties" 
    elementFormDefault="qualified" attributeFormDefault="unqualified"> 

    <element name="objects"> 
     <complexType> 
      <sequence> 
       <element name="object" maxOccurs="unbounded"> 
        <complexType> 
         <attribute name="name" type="string" /> 
         <attribute name="color" type="string" /> 
        </complexType> 
       </element> 
      </sequence> 
     </complexType> 
     <unique name="UniqueObjectName"> 
      <selector xpath="tns:object" /> 
      <field xpath="@name" /> 
     </unique> 
     <unique name="UniqueObjectNameColor"> 
      <selector xpath="tns:object" /> 
      <field xpath="@name" /> 
      <field xpath="@color" /> 
     </unique> 
    </element> 

</schema> 
+2

Salut micfra, merci pour votre réponse. Je veux que ceci soit valide: '' Avec votre contrainte 'UniqueObjectName', ceci ne sera pas valide. Je voulais seulement éviter les copies exactes: Non valide: '' – Vitor

+0

Donc, je n'ai pas compris votre question correcte, mais cela peut être réalisable. – micfra

+0

Si vous avez la possibilité de passer à XMl Schema 1.1, vous pouvez ajouter sur votre définition "objet". Je ne suis pas familier avec ceci, donc je ne peux pas vous aider plus loin. – micfra

4

Utilisez use et default avec ou sans valeur comme:

<element name="objects"> 
     <complexType> 
      <sequence> 
       <element name="object" maxOccurs="unbounded"> 
        <complexType> 
         <attribute name="name" type="string" /> 
         <attribute name="color" type="string" use="optional" default="noColor" /> 
        </complexType> 
       </element> 
      </sequence> 
     </complexType> 
     <unique name="UniqueObjectNameColor"> 
      <selector xpath="tns:object" /> 
      <field xpath="@name" /> 
      <field xpath="@color" /> 
     </unique> 
    </element> 

</schema>