我需要创建一个项目列表的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种物品。每个项目都有一个额外的元素:
没有元素具有属性,并且不需要进一步扩展项目。
我尝试使用扩展程序但是,您不能在父级中使用<xs:all>
然后扩展。
然后我尝试制作一个superItem,其中一个项目可以选择鱼,蔬菜或水果,但你不能在<xs:all>
内使用选择。
如何使用<xs:all>
扩展名,或者我可以创建一个解决方法,使其不具有序列所需元素的固定顺序?在实际代码中,我的项目和子类型的元素比上面显示的元素多得多,因此在所有可能的排列之间做出选择是不可行的。
答案 0 :(得分:1)
您需要XML Schema 1.1才能通过扩展将元素添加到xsd:all
内容模型中。如果您可以使用强制元素排序,则可以使用xsd:sequence
代替XSD 1.0或1.1。
请参阅XML Schema Part 1: Structures Second Edition,2.2.1.3 Complex Type Definition部分:
注意:此规范仅允许附加,而不允许其他类型 扩展。此决定简化了所需的应用程序处理 将实例从派生类型转换为基类型。未来版本可能允许 更多种类的扩展,需要更复杂的转换 效果铸造。
请参阅W3C XML Schema Definition Language (XSD) 1.1 Part 1: Structures,2.2.1.3 Complex Type Definition部分:
注意:在大多数情况下,此规范仅允许附加,和 不是其他类型的扩展。此决定简化了应用程序 将实例从派生类型转换为实例所需的处理 基础类型。一个特殊情况允许以方式扩展所有组 不能保证新材料只在最后发生 内容。另一个特例是通过Open Contents扩展 交错模式。