在我的XML模式文件中,我具有以下具有某些属性的基本类型:
<xs:complexType name="block">
<xs:attribute name="blockid" type="xs:integer" use="required"/>
<xs:attribute name="x" type="xs:integer" use="required"/>
<xs:attribute name="y" type="xs:integer" use="required"/>
</xs:complexType>
以及通过扩展它而获得的其他几种类型,以允许其他属性或子元素:
<xs:complexType name="wall">
<xs:complexContent>
<xs:extension base="block">
<xs:attribute name="width" type="xs:integer" use="required"/>
<xs:attribute name="height" type="xs:integer" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="key">
<xs:complexContent>
<xs:extension base="block">
<xs:sequence maxOccurs="unbounded">
<xs:element name="keyid" type="xs:integer"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
和其他人。
现在,我想定义一个元素,该元素可以将这些扩展类型中的任何一个作为子元素,但不能将其作为基本类型。
我现在可以执行以下操作:
<xs:complexType name="room">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="wall" type="wall"/>
<xs:element name="key" type="key"/>
<xs:element .../>
and so on for each extended type
</xs:choice>
</xs:complexType>
但是,由于将来我可能会添加其他扩展类型,并且它们都可以是room元素的子元素类型,因此有一种方法可以告诉我们允许从块扩展的任何类型,而不是提及扩展类型一一吗?
我不想引用它们中的每一个,而是要做类似的事情:
<xs:complexType name="room">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="whatever" type="any type extended from block"/>
</xs:choice>
</xs:complexType>
答案 0 :(得分:1)
我建议在这里使用取代基。
<xs:element name="block" abstract="true" type="block"/>
<xs:element name="wall" substitutionGroup="block">
<xs:complexType>
<xs:complexContent>
<xs:extension base="block">
<xs:attribute name="width" type="xs:integer" use="required"/>
<xs:attribute name="height" type="xs:integer" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:complexType name="room">
<xs:sequence>
<xs:element ref="block" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>