每个元素类型可以有多个替换组吗?

时间:2010-03-12 21:27:38

标签: inheritance xsd

假设您在架构中有以下内容:

    <xsd:complexType name="shape"/>

    <xsd:complexType name="circle">
            <xsd:complexContent>
                <xsd:extension base="shape">
                    <xsd:attribute name="radius" type="xsd:double"/>
                </xsd:extension>
            </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="arc">
                <xsd:complexContent>
                    <xsd:extension base="circle">
                        <xsd:attribute name="startAngle" type="xsd:double"/>
                        <xsd:attribute name="endAngle" type="xsd:double"/>
                    </xsd:extension>
                </xsd:complexContent>
    </xsd:complexType>

然后可以添加像这样的替换组

<xsd:element name="shape" type="shape" abstract="true"/>
<xsd:element name="circle" type="circle" substitutionGroup="shape"/>
<xsd:element name="arc" type="arc" substitutionGroup="shape"/>

然后通过引用组来接受任何类型:

<xsd:element ref="shape"/>

那部分不是问题。

但是,如果我也希望能够允许(在另一部分中)只是圈子及其子类型呢?

是否可以添加多个替换组以模拟架构中的正确继承?我尝试添加另一种元素类型:

<xsd:element name="shape" type="shape" abstract="true"/>
<xsd:element name="circle" type="circle" substitutionGroup="shape"/>
<xsd:element name="arc" type="arc" substitutionGroup="shape"/>
<xsd:element name="arc2" type="arc" substitutionGroup="circle"/>

但我不想根据我的期望改变预期元素的名称。

有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

您应该能够arc替代circle。无论您使用shape的任何地方,circlearc,然后应用,circlecirclearc