【发布时间】:2009-12-18 08:36:59
【问题描述】:
以下 XSD 应验证 favorite_fruit 元素的 name 属性应仅在 fruits 元素中包含 names 或 fruit。这是 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。
【问题讨论】:
-
你能给我们看看 XML 吗?
-
w3.org/2001/03/webdata/xsv 的 W3C 模式验证器说没问题,所以我猜你的工具坏了和/或太挑剔了。
-
xml在上面的帖子中。
-
tools.decisionsoft.com/schemaValidate/results.jsp 的验证器也返回无效结果。
-
我发现了问题。匿名复杂类型指定没有类型的属性“名称”。 Fruit 类型有一个属性“name”,其类型为:xsd:string。因为这两个属性没有相同的类型,所以它们无法匹配。因此,将匿名复杂类型属性定义更改为:
有效。如果有人将此添加为答案,我会将其标记为正确:)
标签: validation xpath xsd