2009-12-18 40 views
1

以下XSD應驗證fruits元素中favorite_fruit元素的name屬性應僅包含names,fruit。下面是XSD:這個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應該是有效的,但驗證時是無效的:

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

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

任何想法?我的直覺是我的xpath有問題。 PS:我使用lxml來驗證對xsd的xml。

+0

你能告訴我們XML嗎? – Oded 2009-12-18 08:39:10

+2

W3C模式驗證器在http://www.w3.org/2001/03/webdata/xsv表示它沒問題,所以我猜測你的工具已經損壞或者太繁瑣。 – skaffman 2009-12-18 08:41:43

+0

xml已在上述文章中。 – Johan 2009-12-18 08:58:09

回答

1

匿名複雜類型指定一個屬性'名稱'沒有類型。 Fruit類型具有屬性'name',其類型爲:xsd:string。因爲這兩個屬性不具有相同的類型,所以它們無法匹配。因此,將匿名複雜類型屬性定義更改爲:有效。

0

您還沒有給過favourite_fruitxsd:element類型。所以架構不能驗證對類型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 2009-12-18 08:46:18

+0

他想要根據他的類型進行驗證。 – Oded 2009-12-18 08:46:49

+0

實際上,我只想驗證我的匿名類型的名稱屬性是否等於fruits數組中水果類型的名稱之一。 – Johan 2009-12-18 08:59:48