2010-12-07 4 views
3

je le code XML suivant:XMl Schéma: valeurs clés uniques au sein parent

<enumTypes xmlns="tempURI"> 
    <enumType id="1"> 
     <enumValue id="1" value="Item1"/> 
     <enumValue id="2" value="Item2"/> 
     <enumValue id="3" value="Item3"/> 
    </enumType> 
    <enumType id="2"> 
     <enumValue id="1" value="Item1"/> 
     <enumValue id="2" value="Item2"/> 
    </enumType> 
</enumTypes> 

j'ai aussi le schéma suivant:

   <xs:element name="enumTypes"> 
       <xs:complexType> 
        <xs:sequence minOccurs="1" maxOccurs="unbounded"> 
         <xs:element name="enumType"> 
          <xs:complexType> 
           <xs:sequence minOccurs="1" maxOccurs="unbounded"> 
            <xs:element name="enumValue"> 
             <xs:complexType> 
              <xs:attribute name="id" type="xs:string" use="required"/> 
              <xs:attribute name="value" type="xs:string" use="required"/> 
             </xs:complexType> 
            </xs:element> 
           </xs:sequence> 
           <xs:attribute name="id" type="xs:string"/> 
          </xs:complexType> 
         </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
    <xs:key name="enumTypeKey"> 
     <xs:selector xpath="enumTypes/enumType"/> 
     <xs:field xpath="@id"/> 
    </xs:key> 
    <xs:key name="enumValueKey"> 
     <xs:selector xpath="enumTypes/enumType/enumValue"/> 
     <xs:field xpath="@id"/> 
    </xs:key> 

Je suis en train de forcer à être unique de l'ID enumValue DANS un enumType, mais jusqu'à présent, je ne peux l'obtenir que pour les forcer à être uniques dans TOUS les types d'énumération.

Je suppose qu'il y a un problème avec mon sélecteur XPath mais je n'arrive pas à le résoudre.

Toute aide serait appréciée!

Répondre

3

Je pense que vous avez seulement donné un fragment de votre xsd? Il est plus facile de déboguer si vous pouvez fournir un extrait de travail. J'ai ajouté un <element name="root"> pour le valider.

Le problème semble être que les sélecteurs enumValueKey regroupent tous les enumValues, parmi tous les enumType; mais vous voulez seulement regrouper ceux dans un enumType.

La seule façon que je peux voir pour y remédier est de déplacer le <key> pour enumValues dans l'élément enumType (et régler le sélecteur xpath), de sorte que toute chose devient:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="enumTypes"> 
      <xs:complexType> 
      <xs:sequence minOccurs="1" maxOccurs="unbounded"> 
       <xs:element name="enumType"> 
       <xs:complexType> 
        <xs:sequence minOccurs="1" maxOccurs="unbounded"> 
        <xs:element name="enumValue"> 
         <xs:complexType> 
         <xs:attribute name="id" type="xs:string" use="required"/> 
         <xs:attribute name="value" type="xs:string" use="required"/> 
         </xs:complexType> 
        </xs:element> 
        </xs:sequence> 
        <xs:attribute name="id" type="xs:string"/> 
       </xs:complexType> 
       <xs:key name="enumValueKey"> 
        <xs:selector xpath="enumValue"/> 
        <xs:field xpath="@id"/> 
       </xs:key> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:key name="enumTypeKey"> 
     <xs:selector xpath="enumTypes/enumType"/> 
     <xs:field xpath="@id"/> 
    </xs:key> 
    </xs:element> 
</xs:schema> 

Cela fonctionne, en ce sens il permet à votre exemple XML, et il interdit le fragment suivant (avec deux 1 « s) comme il se doit:

... 
<enumType id="2"> 
    <enumValue id="1" value="Item1"/> 
    <enumValue id="1" value="Item2"/> 
</enumType> 
... 

Laissez-moi savoir si cela fonctionne pour vous. Je suis également intéressé s'il y a un autre moyen d'exprimer cela.

+1

C'était tout. Merci pour l'aide! – goombaloon

0

Je pense que vos instructions xs: key seraient écrites à l'intérieur de l'élément <xs:element name="enumTypes">. Donc:

<xs:element name="enumTypes"> 
... what you want ... 
<xs:key ... and so on 
</xs:element> 
Questions connexes