2009-09-15 8 views
3

Quelqu'un peut-il me dire pourquoi l'élément unique de mon XSD ne force pas l'unique? Cela devrait générer une erreur car le dernier élément ScreenResult ne contient pas de valeur unique pour l'attribut Type. Je devrais également noter que je suis vraiment après avoir forcé un de chaque Type dans ScreenResults (ScreenResult est requis pour exister 3 fois, il y a 3 types d'écrans et je demande l'unicité) donc s'il y a une meilleure manière d'accomplir cela , Je suis tout à fait pour ça aussi.Comment rendre univoque mon énumération par xs: unique

Merci.

Voici mon extrait XML:

<ScreenResults> 
    <ScreenResult Type="Screen Type A">1</ScreenResult> 
    <ScreenResult Type="Screen Type B">1</ScreenResult> 
    <ScreenResult Type="Screen Type B">2</ScreenResult> 
</ScreenResults> 

Voici mon extrait XSD (notez également que mes extraits de XSD originaux couvrent plusieurs fichiers mais j'ai vérifié tous mes espaces de noms sont corrects):

<xs:element name="ScreenResults" type="import:ScreenResults" minOccurs="0" maxOccurs="1"> 
    <xs:unique name="UniqueScreenResults"> 
     <xs:selector xpath="ScreenResult" /> 
     <xs:field xpath="@Type" /> 
    </xs:unique> 
</xs:element> 

<!--============ ScreenResults =============--> 
<xs:complexType name="ScreenResults"> 
    <xs:sequence minOccurs="1" maxOccurs="1"> 
     <xs:element name="ScreenResult" minOccurs="3" maxOccurs="3"> 
      <xs:complexType> 
       <xs:simpleContent> 
        <xs:extension base="enum:ScreenResult"> 
         <xs:attribute name="Type" type="enum:ScreenType" use="required" /> 
        </xs:extension> 
       </xs:simpleContent> 
      </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

<!--============= ScreenType =============--> 
<xs:simpleType name="ScreenType"> 
    <xs:restriction base='xs:token'> 
     <xs:enumeration value='Screen Type A' > 
      <xs:annotation> 
       <xs:documentation>1</xs:documentation> 
      </xs:annotation> 
     </xs:enumeration> 
     <xs:enumeration value='Screen Type B' > 
      <xs:annotation> 
       <xs:documentation>2</xs:documentation> 
      </xs:annotation> 
     </xs:enumeration> 
     <xs:enumeration value='Screen Type C' > 
      <xs:annotation> 
       <xs:documentation>3</xs:documentation> 
      </xs:annotation> 
     </xs:enumeration> 
    </xs:restriction> 
</xs:simpleType> 

<!--============ ScreenResult ============--> 
<xs:simpleType name="ScreenResult"> 
    <xs:restriction base='xs:token'> 
     <xs:enumeration value='1' > 
      <xs:annotation> 
       <xs:documentation>Positive</xs:documentation> 
      </xs:annotation> 
     </xs:enumeration> 
     <xs:enumeration value='2' > 
      <xs:annotation> 
       <xs:documentation>Negative</xs:documentation> 
      </xs:annotation> 
     </xs:enumeration> 
     <xs:enumeration value='3' > 
      <xs:annotation> 
       <xs:documentation>Not administered</xs:documentation> 
      </xs:annotation> 
     </xs:enumeration> 
    </xs:restriction> 
</xs:simpleType> 

Répondre

10

Je poste ma solution pour toute autre personne qui rencontre ce problème.
Bien que j'aie affirmé que tous mes espaces de noms étaient corrects, c'était, bien sûr, le problème. Tous les espaces de noms étaient corrects sauf sur l'élément unique lui-même.
J'ai supposé à tort que l'élément unique n'aurait pas besoin de préfixer un espace de noms tel qu'il était dans le contexte. Mais ce n'est pas le cas. Comme j'ai déclaré un espace de noms par défaut pour le fichier, j'avais toujours besoin du préfixe.

Donc, mon seul changement, et la solution est la suivante:

<xs:element name="ScreenResults" type="import:ScreenResults" minOccurs="0" maxOccurs="1"> 
    <xs:unique name="UniqueScreenResults"> 
     <xs:selector xpath="import:ScreenResult" /> 
     <xs:field xpath="@Type" /> 
    </xs:unique> 
</xs:element> 
+0

Merci pour poster votre solution, je juste eu exactement le même problème. – Heinzi

+0

Juste au cas où vous voulez un ** attribut ** univoque plutôt qu'une valeur, cela devrait résoudre votre problème: http://stackoverflow.com/a/39435125/1040399 –

Questions connexes