我有以下要求,并且正在尝试确定如何最好地对XSD进行建模以表示这些要求。
我有许多XML元素的实例,比如<box>
。每个<box>
都有一个必需的属性t="[box-type]"
,每个具有特定类型的框(例如t="tall"
)都有另一个必需属性v="10"
,表示高框的高度。所有<box>
es都具有t
和v
属性,但对v
属性接受的值的限制取决于其t
属性的值
例如,采用以下XML:
<box t="tall" v="10"/>
<box t="named" v="George"/>
<box t="colored" v="green"/>
现在,在我的XSD中,我需要能够代表一系列这样的元素。我的想法是做类似下面的事情,只列出我的序列中所有允许的框类型(在下面的代码片段末尾):
<xsd:simpleType name="box_types">
<xsd:restriction base="xsd:token">
<xsd:enumeration value="tall" />
<xsd:enumeration value="named" />
<xsd:enumeration value="colored" />
</xsd:restriction>
</xsd:simpleType>
<!--Box base-->
<xsd:complexType name="box_type">
<xsd:attribute name="t" use="required" type="box_types"/>
<xsd:attribute name="v" use="required"/>
</xsd:complexType>
<!--Box concrete types-->
<xsd:complexType name="tall_box_type">
<xsd:complexContent>
<xsd:extension base="box_type">
<xsd:attribute name="t" fixed="tall" use="required"/>
<xsd:attribute name="v" type="xsd:int" use="required"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="named_box_type">
<xsd:complexContent>
<xsd:extension base="box_type">
<xsd:attribute name="t" fixed="named" use="required"/>
<xsd:attribute name="v" type="xsd:string" use="required"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="colored_box_type">
<xsd:complexContent>
<xsd:extension base="box_type">
<xsd:attribute name="t" fixed="colored" use="required"/>
<xsd:attribute name="v" type="xsd:token" use="required"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<!--And finally, the place where boxes show up-->
<xsd:complexType name="box_usage">
<xsd:sequence>
<xsd:element name="box" type="tall_box_type"/>
<xsd:element name="box" type="named_box_type"/>
<xsd:element name="box" type="colored_box_type"/>
</xsd:sequence>
</xsd:complexType>
不幸的是,这不是一个有效的XSD - VS给了我几个错误,最不幸的是Elements with the same name and in the same scope must have the same type
。关于如何在XSD中表示这些t / v耦合属性限制的任何建议?
答案 0 :(得分:1)
XML Schema 1.0无法验证值之间的依赖关系。您的选择是:
tallBox
,colorBox
和nameBox
作为元素名称。