2010-12-07 13 views
3

内で一意のキー値Iは、次のXML持っている:私は一意であることがenumValue IDのを強制しようとしているXMLスキーマ:親

   <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> 

<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> 

を私は次のスキーマをも持っていますenumTypeの中にありますが、これまではすべてのenumTypesで一意になるように強制することしかできません。

私のセレクタXPathに問題があると推測していますが、それを並べ替えることはできません。

助けていただけたら幸いです!

答えて

3

私はあなたのxsdの断片を与えたと思いますか?あなたが働くスニペットを提供できるなら、デバッグするのが簡単です。それを検証するために周囲に<element name="root">を追加しました。

のセレクタグループのすべてが、そのうちのenumTypeです。 1つのグループ内でグループ化したいだけですenumType

私はそれを修正するために見ることができる唯一の方法はenumType要素にenumValuesため<key>を移動(とxpathセレクタを調整)するので、全部は次のようになります。

<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> 

これは動作しますが、その中でそれはあなたのXMLの例を可能にし、それが必要として、それは(2 1年代で)次のフラグメントを禁じ:

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

はこれがあなたのために働くなら、私に教えてください。私はまたこれを表現する他の方法があれば興味があります。

+1

それでした。助けてくれてありがとう! – goombaloon

0

あなたのxs:keyステートメントは<xs:element name="enumTypes">要素の中に書き込まれると思います。だから:

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