inheritance - 每个元素类型是否可以有多个替换组?

标签 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"/>

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

有更好的方法吗?

最佳答案

您应该能够仅保留 arc 作为 circle 的替代品。无论您在哪里使用 shape,都可以应用 circlearc,而在使用 circle 的地方,可以应用

关于inheritance - 每个元素类型是否可以有多个替换组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2436017/

相关文章:

xml - xsd 唯一选择器路径 : exclude specific elements

java - 如何解决此 j2ee 架构中的重复属性错误?

java - Java中的类等价

java - 尽管不允许多重继承,但一个类如何扩展另一个类,扩展 Object 类?

java - 如何使用泛型类型的构造函数/类型转换

ruby-on-rails - 如何使用继承和嵌套属性构建 Rails 表单?

c# - xs :key, 为什么当键值不是键引用的成员时验证通过?

Python:扩展从使用工厂方法的第三方包返回的类/对象

java - 动态生成 XML Schema

xml - 使用 erlsom 编写 XML 时出现问题