2010-12-07 60 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>