当需要在XML Schema中扩展complexType时,如何使用<xs:all>?</xs:all>

时间:2014-04-07 16:48:50

标签: xml xsd

我需要创建一个项目列表的XSD架构:

<xs:element name="Items">
<xs:complexType>
<xs:sequence>
    <xs:element name="Item" minOccurs="0" maxOccurs="unbounded" type="Item" />
</xs:sequence>
</xs:complexType>
</xs:element>

每个项目都有一个名称和一个ID,但这些元素的顺序是未知的,并且可能因每个项目而异。所以我像这样使用<xs:all>

<xs:complexType name="Item">
    <xs:all>
        <xs:element name="Name" type="xs:string"/>
        <xs:element name="ID" type="xs:integer"/>
    </xs:all>
</xs:complexType>

这很有效。但是,我有3种物品。每个项目都有一个额外的元素:

  • itemA:可以拥有0个未绑定的“fish”元素
  • itemB:可以有0-1“蔬菜”元素
  • itemC:正好有2个“水果”元素

没有元素具有属性,并且不需要进一步扩展项目。

我尝试使用扩展程序但是,您不能在父级中使用<xs:all>然后扩展。

然后我尝试制作一个superItem,其中一个项目可以选择鱼,蔬菜或水果,但你不能在<xs:all>内使用选择。

如何使用<xs:all>扩展名,或者我可以创建一个解决方法,使其不具有序列所需元素的固定顺序?在实际代码中,我的项目和子类型的元素比上面显示的元素多得多,因此在所有可能的排列之间做出选择是不可行的。

1 个答案:

答案 0 :(得分:1)

您需要XML Schema 1.1才能通过扩展将元素添加到xsd:all内容模型中。如果您可以使用强制元素排序,则可以使用xsd:sequence代替XSD 1.0或1.1。

XML Schema 1.0

请参阅XML Schema Part 1: Structures Second Edition2.2.1.3 Complex Type Definition部分:

  

注意:此规范仅允许附加,而不允许其他类型   扩展。此决定简化了所需的应用程序处理   将实例从派生类型转换为基类型。未来版本可能允许   更多种类的扩展,需要更复杂的转换   效果铸造。

XML Schema 1.1

请参阅W3C XML Schema Definition Language (XSD) 1.1 Part 1: Structures2.2.1.3 Complex Type Definition部分:

  

注意:在大多数情况下,此规范仅允许附加,和   不是其他类型的扩展。此决定简化了应用程序   将实例从派生类型转换为实例所需的处理   基础类型。一个特殊情况允许以方式扩展所有组   不能保证新材料只在最后发生   内容。另一个特例是通过Open Contents扩展   交错模式。