这个xsd出了什么问题?

时间:2009-12-18 08:37:00

标签: validation xpath xsd

以下XSD应验证favorite_fruit元素的name属性应仅在names元素中包含fruitfruits。这是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来验证xml对xsd。

2 个答案:

答案 0 :(得分:1)

匿名复杂类型指定没有类型的属性“name”。 Fruit类型具有属性“name”,其类型为:xsd:string。因为这两个属性不具有相同的类型,所以它们无法匹配。因此,将匿名复杂类型属性定义更改为:works。

答案 1 :(得分:0)

您尚未向xsd:element的{​​{1}}提供类型。因此架构无法针对类型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