xsd中的抽象

xsd中的抽象,xsd,Xsd,我正在做一个XSD。我想要一个容器元素(复杂类型),它包含任何基本类型为组件的元素 一种方法是 <complexType name="Container"> <sequence> <element name="Child" type="am:Component"></element> </sequence> </complexType> 用第一种方法,我最终会 <container&g

我正在做一个XSD。我想要一个
容器
元素(复杂类型),它包含任何基本类型为
组件
的元素

一种方法是

<complexType name="Container">
    <sequence>
        <element name="Child" type="am:Component"></element>
    </sequence>
</complexType>
用第一种方法,我最终会

<container>
    <child fooTag="foo"/>
    <child fooTag="foo"/>
    <child bazTag="baz"/>
    <child barTag="bar"/>
</container>


我可以简单地使用
xs:any
元素,但这样我就不会断言子元素必须是
组件。有什么方法可以得到我想要的吗?

最终,您需要能够说“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" />


我很害怕。谢谢你的回答和例子。是的。。。不幸的是,对于任何从编程角度来看的人来说,这种行为都是违反直觉的。尽管这一限制在.NET web服务中得到了证明,但WSDL生成器不够智能,无法处理子类型,除非您明确告诉它给定类型的哪些子类型是有效的(通过XmlIncludeAttribute)。
<xs:element name="type1" type="Type1" />
<xs:element name="type2" type="Type2" />
<xs:element name="type3" type="Type3" />
<xs:element name="type4" type="Type4" />