2010-12-07 35 views
3

內唯一鍵值我有下面的XML:XML模式:父

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

我也有以下模式:

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

我試圖迫使enumValue的ID是唯一的在枚舉類型中,但到目前爲止,我只能通過強制它們在所有枚舉類型中唯一。

我猜我的選擇器XPath存在問題,但我似乎無法將它整理出來。

任何幫助,將不勝感激!

回答

3

我想你只給出了你的xsd的一個片段?如果您可以提供工作片段,則更容易進行調試。我添加了一個環繞的<element name="root">以使其生效。

問題似乎是enumValueKey選擇器將所有enumType的所有enumValues分組;但您只想將這些組合在一個enumType之內。

我可以看到修復它是移動<key>enumValuesenumType元素(和調整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例子,它禁止下面的片段(有兩個1的),因爲它應該:

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

讓我知道這對你的作品。如果有其他表達方式,我也很感興趣。

+1

就是這樣。謝謝您的幫助! – goombaloon 2010-12-14 20:15:39

0

我認爲你的xs:key語句會被寫入<xs:element name="enumTypes">元素中。所以:

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