我正在尝试为以下文档创建XML架构。我想要一个可以包含List
s或TextItem
s的List
元素:
<!-- a "List" containing "TextItem"s: -->
<List>
<TextItem><TextItemData>foo</TextItemData></TextItem>
<TextItem><TextItemData>bar</TextItemData></TextItem>
</List>
<!-- a "List" containing "List"s of "TextItem"s: -->
<List>
<List>
<TextItem><TextItemData>foo1</TextItemData></TextItem>
<TextItem><TextItemData>bar1</TextItemData></TextItem>
</List>
<List>
<TextItem><TextItemData>foo2</TextItemData></TextItem>
<TextItem><TextItemData>bar2</TextItemData></TextItem>
</List>
</List>
以下XML架构定义完成了任务:
<xs:complexType name="TextItemType">
<xs:sequence>
<xs:element name="TextItemData" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ListType">
<xs:choice>
<xs:sequence>
<xs:element name="TextItem" type="TextItemType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:element name="List" type="ListType" minOccurs="0" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
我真正想要的是如下列表(没有TextItemData
):
<List>
<TextItem>foo</TextItem>
<TextItem>bar</TextItem>
</List>
我可以将TextItem
的定义纳入List
的定义,以摆脱TextItemData
。但是,由于我在示例中省略了属性,TextItem
的定义实际上相当复杂。此外,还有其他类型的项目,例如BinaryItems
。 List
的定义会变得难以置信。
如何删除对TextItemData
元素的需求?
答案 0 :(得分:1)
听起来你真正想做的就是:
<xs:complexType name="TextItemType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="FirstAttribute" />
<xs:attribute name="SecondAttribute" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:element name="TextItem" type="TextItemType" />
但如果你只是将它用于那一个元素,那么定义TextItemType是不必要的。你可以这样做:
<xs:element name="TextItem">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="FirstAttribute" />
<xs:attribute name="SecondAttribute" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>