以下XSD应验证favorite_fruit
元素的name
属性应仅在names
元素中包含fruit
个fruits
。这是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。
答案 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