2013-01-25 4 views
0

Hey, je voudrais forcer un attribut à être unique dans mon document XML. Je commence juste le XML. Je voudrais faire en sorte que chaque personne ait un identifiant unique. J'ai regardé xs: unique mais je n'arrive pas à comprendre où ça va ici ça ne va pas analyser chaque fois que j'essaie. Le schéma est le suivant:xs: comment puis-je le faire fonctionner?

<?xml version='1.0' encoding='utf-8'?> 
<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'> 
    <xs:element name='people' type='peopleType' /><!-- Root Element --> 

    <xs:complexType name='peopleType'> 
     <xs:sequence> 
      <xs:element name='person' type='personType' maxOccurs='unbounded'/> 
     </xs:sequence> 
    </xs:complexType><!-- End peopleType--> 

    <xs:complexType name='personType'> 

     <xs:sequence> 
      <xs:element name='name' type='nameType' maxOccurs='unbounded' /> 
      <xs:element name='email' minOccurs='1'> 
       <xs:simpleType> 
        <xs:restriction base='xs:string'> 
         <xs:pattern value='([a-zA-Z0-9_-])*([.])?([a-zA-Z0-9_-])*([.])?([a-zA-Z0-9_-])*[@]([a-zA-Z0-9_-])*([.])?([a-zA-Z0-9_-])*([.])?([a-zA-Z0-9_-])*' /> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:element> 
      <xs:element name='favColour' type='colourType' minOccurs='0' /> 

     </xs:sequence> 

     <xs:attribute name='id' type='xs:integer' /> 

    </xs:complexType><!--End personType --> 

    <xs:complexType name='nameType'> 
     <xs:sequence> 
      <xs:element name='given' minOccurs='1'> 
       <xs:simpleType> 
        <xs:restriction base='xs:string'> 
         <xs:pattern value='[A-Z]([a-z])*' /> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:element> 
      <xs:element name='family' minOccurs='1'> 
       <xs:simpleType> 
        <xs:restriction base='xs:string'> 
         <xs:pattern value='[A-Z]([a-z])*' /> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType><!-- End nameType --> 

    <xs:complexType name='colourType'> 
     <xs:sequence> 
      <xs:element name='red' minOccurs='1' > 
       <xs:simpleType> 
        <xs:restriction base='xs:integer'> 
         <xs:minInclusive value='0' /> 
         <xs:maxInclusive value='255' /> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:element> 
      <xs:element name='green' minOccurs='1' > 
       <xs:simpleType> 
        <xs:restriction base='xs:integer'> 
         <xs:minInclusive value='0' /> 
         <xs:maxInclusive value='255' /> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:element> 
      <xs:element name='blue' minOccurs='1'> 
       <xs:simpleType> 
        <xs:restriction base='xs:integer'> 
         <xs:minInclusive value='0' /> 
         <xs:maxInclusive value='255' /> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType><!-- End colourType --> 
</xs:schema> 

[EDIT] Après avoir pris conseil que je fait les modifications suivantes. Il analyse bien mais n'applique pas les attributs uniques.

<xs:complexType name='peopleType'> 
     <xs:sequence> 
      <xs:element name='person' type='personType' maxOccurs='unbounded'> 
       <xs:unique name="MyUserNameUniqueKey"> 
      <xs:selector xpath="person" /> 
      <xs:field xpath="@id" /> 
      </xs:unique> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType><!-- End peopleType--> 

Répondre

2

Dans la déclaration d'élément pour les personnes, ajoutez un xs: déclaration unique avec sélecteur XPath = "personne", champ XPath = "@ id". Si cela ne fonctionne pas, montrez-nous ce que vous avez essayé.