xsd中的抽象

时间:2010-06-27 03:20:15

标签: xsd

我正在研究XSD。我想要一个container元素(复杂类型),其中包含基类型为component的任何元素。

一种方法是......

<complexType name="Container">
    <sequence>
        <element name="Child" type="am:Component"></element>
    </sequence>
</complexType>

但问题在于我的组件被称为儿童。假设我有3个组件,foobarbaz。我希望能够制作一个看起来像......的文件。

<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。有没有办法可以得到我想要的东西?

1 个答案:

答案 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" />