我正在研究XSD。我想要一个container
元素(复杂类型),其中包含基类型为component
的任何元素。
一种方法是......
<complexType name="Container">
<sequence>
<element name="Child" type="am:Component"></element>
</sequence>
</complexType>
但问题在于我的组件被称为儿童。假设我有3个组件,foo
,bar
和baz
。我希望能够制作一个看起来像......的文件。
<container>
<foo fooTag="foo"/>
<foo fooTag="foo"/>
<baz bazTag="baz"/>
<bar barTag="bar"/>
</container>
第一种方法我最终会......
<container>
<child fooTag="foo"/>
<child fooTag="foo"/>
<child bazTag="baz"/>
<child barTag="bar"/>
</container>
我可以简单地使用xs:any
元素但是我会失去我的断言,即孩子必须是component
。有没有办法可以得到我想要的东西?
答案 0 :(得分:2)
最终你需要能够说“Type Foo由一个名为foo的元素表示”,这就是xs:element的name属性。你不能完全抽象(就像在编程语言中那样),因为类型只是定义,并且在你给它之前没有特定的元素名称。
您需要列出序列中的每个可能的子类型。
<xs:sequence>
<xs:choice>
<xs:element name="type1" type="Type1" />
<xs:element name="type2" type="Type2" />
<xs:element name="type3" type="Type3" />
<xs:element name="type4" type="Type4" />
</xs:choice>
</xs:sequence>
您还可以全局定义元素名称并像这样引用它们,但最终您仍需要指明容器元素中哪些子元素名称有效。
<xs:sequence>
<xs:any>
<xs:element ref="type1" />
<xs:element ref="type2" />
<xs:element ref="type3" />
<xs:element ref="type4" />
</xs:any>
</xs:sequence>
其他地方:
<xs:element name="type1" type="Type1" />
<xs:element name="type2" type="Type2" />
<xs:element name="type3" type="Type3" />
<xs:element name="type4" type="Type4" />