2009-12-18 5 views
1

다음 XSD는 요소의 name 특성이 fruits 요소에 fruitnames 만 포함해야 함을 확인해야합니다.이 xsd의 문제점은 무엇입니까?

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:complexType name="Fruit"> 
    <xsd:attribute name="name" type="xsd:string"/> 
    </xsd:complexType> 

    <xsd:complexType name="FruitArray"> 
    <xsd:sequence> 
     <xsd:element name="fruit" minOccurs="0" maxOccurs="unbounded" type="Fruit"/> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:element name="fruit_basket"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="fruits" minOccurs="1" maxOccurs="1" type="FruitArray"/> 
     <xsd:element name="favourite_fruit" minOccurs="1" maxOccurs="1"> 
      <xsd:complexType> 
      <xsd:attribute name="name" use="required"/> 
      </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:key name="fruit_lookup"> 
     <xsd:selector xpath="fruits/fruit"/> 
     <xsd:field xpath="@name"/> 
    </xsd:key> 

    <xsd:keyref name="favourite_fruit_constraint" refer="fruit_lookup"> 
     <xsd:selector xpath="favourite_fruit"/> 
     <xsd:field xpath="@name"/> 
    </xsd:keyref>  
    </xsd:element> 
</xsd:schema> 

다음 XML은 유효해야하지만 검증 할 때 유효하지 않습니다 다음은 XSD는

<fruit_basket> 
    <fruits> 
    <fruit name="Apple"/> 
    <fruit name="Peach"/> 
    <fruit name="Bananna"/> 
    </fruits> 

    <favourite_fruit name="Apple"/> 
</fruit_basket> 

어떤 아이디어? 내 직감은 내 xpath에 문제가 있다는 것입니다. 추신 : 나는 XML을 xsd에 대해 유효성을 검사하기 위해 lxml을 사용하고 있습니다.

+0

XML을 표시 할 수 있습니까? – Oded

+2

http://www.w3.org/2001/03/webdata/xsv에있는 W3C 스키마 유효성 검사기는 정상이라고 말합니다. 따라서 귀하의 도구가 고장 났거나 너무 까다 롭다고 생각합니다. – skaffman

+0

xml은 위의 게시물에 있습니다. – Johan

답변

1

익명 복합 유형은 유형없이 '이름'속성을 지정합니다. 과일 유형에는 xsd : string 유형의 'name'속성이 있습니다. 두 속성은 동일한 유형이 아니기 때문에 일치시킬 수 없습니다. 따라서 익명 복합 유형 속성 정의를 다음으로 변경하면 작동합니다.

0

xsd:element에 유형을 지정하지 않았습니다. favourite_fruit입니다. 그래서 스키마 유형 Fruit에 대해 유효성을 검사 할 수 없습니다 :

<xsd:element name="favourite_fruit" minOccurs="1" maxOccurs="1"> 
     <xsd:complexType> 
     <xsd:attribute name="name" use="required"/> 
     </xsd:complexType> 
    </xsd:element> 

을 아무데도 당신이 Fruit 될 수있는 유형을 제약하지 않습니다. 그러면 더 잘 작동합니다.

<xsd:element name="favourite_fruit" minOccurs="1" maxOccurs="1" Type="Fruit" /> 
+0

거기에 명명 된 유형이 필요하지 않습니다. 익명이며 중첩 된 복합 유형입니다. – skaffman

+0

그는 자신의 유형에 대해 유효성을 검사하려고합니다. – Oded

+0

실제로 익명 유형의 이름 속성이 fruits 배열의 과일 유형 이름 중 하나와 동일하다는 것을 확인하고 싶지 않습니다. – Johan

관련 문제