我必须编写一个 XML 模式(在 XSD 1.0 中)来验证给定文档。
在本文档中,有一个名为
box
的元素,它可以:
有两个必填属性,
name
和weight
以及其他一些可选属性,无内容
有 一个必需属性,
name
,没有其他属性,以及多个元素作为内容(包括box
元素)。
例如:
<box name="box_1"> <!-- type 2 -->
<box name="box_2"> <!-- type 2 -->
<box name="box_3" weight="10" height="5" /> <!-- type 1 -->
<box name="box_4" weight="15" /> <!-- type 1 -->
</box>
<box name="box_5"> <!-- type 2 -->
<box name="box_6" weight="21" /> <!-- type 1 -->
</box>
</box>
<box name="box_7" weight="21" /> <!-- type 1 -->
问题在于:
我无法用两种不同的类型定义
box
(xmllint 无法识别使用哪种类型,并且会使任何不具有属性 box
的 weight
无效)
我无法在
<xs:attributes>
中添加
<xs:choice>
我无法使用
<xs:alternative>
,因为我必须使用XSD 1.0
我无法将
weight
设为可选,它必须是必需的
我无法修改给定的xml文档
例如,这不起作用:
<xs:complexType name="closet">
<xs:choice maxOccurs="unbounded">
<xs:element name="box" type="TboxComplex" />
<xs:element name="box" type="TboxSimple" />
</xs:choice>
</xs:complexType>
<xs:complexType name="TboxComplex">
<xs:choice maxOccurs="unbounded">
<xs:element name="box" type="TboxComplex" />
<xs:element name="box" type="TboxSimple" />
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
<xs:complexType name="TboxSimple">
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="weight" type="xs:integer" use="required" />
<xs:attribute name="height" type="xs:integer" use="optional" />
</xs:complexType>
> xmllint --schema room.xsd room.xml
room.xml:9: element box: Schemas validity error : Element 'box', attribute 'weight': The attribute 'weight' is not allowed.`
room.xml:9: element box: Schemas validity error : Element 'box', attribute 'height': The attribute 'height' is not allowed.
room.xml:9: element box: Schemas validity error : Element 'box': Missing child element(s). Expected is ( box ).
您能否帮我找到一种定义该元素的方法,而无需更改 xml 文档或切换到 XSD 1.1?预先感谢您!
XSD 1.0 无法定义此约束。您将需要使用一些其他验证技术,例如 XSD 1.1、RelaxNG 或 Schematron;或者,如果您准备向 XML 实例添加
xsi:type
属性,则可以使用 XSD 1.0 来完成此操作。