2010-12-07 7 views
3

내에서 고유 키 값 I가 다음과 같은 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의 고유로 강제로 시도하고를 enumType 내에서,하지만 지금까지는 모든 enumTypes에서 고유하도록 강제 설정할 수 있습니다.

내 선택기 XPath에 문제가있는 것 같아요. 정렬 할 수없는 것처럼 보입니다.

도움이 될 것입니다.

답변

3

나는 xsd의 단편만을 제공했다고 생각하십니까? 작동중인 스 니펫을 제공 할 수 있다면 디버그하는 것이 더 쉽습니다. 유효성을 검사하기 위해 주위에 <element name="root">을 추가했습니다.

문제가있는 것 같습니다 enumValueKey 선택자 그룹 모두 enumValues, 무엇보다 enumType의; 단 하나의 그룹으로 그룹화하려는 경우 enumType. 점에서이 작품

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

:

모든 일이된다 그래서, 그것은 enumType 요소로 enumValues<key>을 이동하는 것입니다 수정 (그리고 xpath 선택을 조정)을 볼 수있는 유일한 방법 그것은 당신의 XML 예제를 허용하고, 정상적으로는 (두 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>