XML模式:如何覆盖从抽象类型继承的抽象元素

时间:2015-03-13 15:36:07

标签: inheritance xsd abstract

我知道标题可能令人困惑。这里有一些XSD试图说明:

首先是一些抽象类型:

<complexType name="ConfigurationBaseType" abstract="true">
  <attribute name="id" type="ID" use="required"/>
</complexType>

<complexType name="TransportBaseType" abstract="true">
  <sequence>
    <element name="configuration" 
             type="msg:ConfigurationBaseType" 
             maxOccurs="unbounded"/>
  </sequence>
</complexType>

TransportBaseType的具体实施者:

<complexType name="ActiveMQTransportType">
  <complexContent>
    <extension base="msg:TransportBaseType">
      <sequence>
        <element name="broker" 
                 type="msg:ActiveMQBrokerType" 
                 maxOccurs="unbounded"/>
        <element name="destination" 
                 type="msg:ActiveMQDestinationType" 
                 maxOccurs="unbounded"/>
      </sequence>
    </extension>
  </complexContent>
</complexType>

我有另一种类型ConfigurationBaseType的具体实施者,我想“插入”作为configuration继承的TransportBaseType元素。

有没有办法在XML模式中执行此操作?欢迎任何建议或替代方法。

1 个答案:

答案 0 :(得分:1)

我见过别人正在尝试你所描述的;既然你已经问过与Java有关的问题,我将使用Java引用,然后用XSD进行说明。

不受限制,让我们假设您的抽象复杂类型是接口;而你的具体类型只是具体的类。

您基于两个接口定义了一个API:TransportBaseType和ConfigurationBaseType。 TransportBaseType有一个get / setConfiguration,它是ConfigurationBaseType类型的列表。

您正在尝试为该API定义“参考”实现。您现在有ActiveMQTransportType:TransportBaseType。但是,您需要确保get / setConfiguration接受ConfigurationBaseTypeImpl,此处定义为ConfigurationBaseType的具体子类型。

您的问题可能是:i)如何确保我的API接受用于get / setConfiguration的ConfigurationBaseTypeImpl?或ii)如何确保我的API接受用于get / setConfiguration的ConfigurationBaseTypeImpl ?

i)在 XSD 1.1 中,您可以使用帮助程序类型实现它(我基于XSD 1.0,但 XSD 1.0 在&lt;时不起作用;配置&gt;重复):

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:complexType name="ConfigurationBaseType" abstract="true">
        <xsd:attribute name="id" type="xsd:ID" use="required"/>
    </xsd:complexType>

    <xsd:complexType name="ConfigurationBaseTypeImpl">
        <xsd:complexContent>
            <xsd:extension base="ConfigurationBaseType">
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="configuration" type="ConfigurationBaseType"/>
    <xsd:element name="configurationImpl" type="ConfigurationBaseTypeImpl" substitutionGroup="configuration"/>

    <xsd:complexType name="TransportBaseType" abstract="true">
        <xsd:sequence>
            <xsd:element ref="configuration" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="ActiveMQTransportTypeBase">
        <xsd:complexContent>
            <xsd:restriction base="TransportBaseType">
                <xsd:sequence>
                    <xsd:element ref="configurationImpl" maxOccurs="unbounded"/>
                </xsd:sequence>
            </xsd:restriction>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="ActiveMQTransportType">
        <xsd:complexContent>
            <xsd:extension base="ActiveMQTransportTypeBase">
                <xsd:sequence>
                    <xsd:element name="broker" maxOccurs="unbounded"/>
                    <xsd:element name="destination" maxOccurs="unbounded"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
</xsd:schema>

ii)你真的不需要做任何事情。在您的XML文件中,只需在配置元素中添加指向ConfigurationBaseTypeImpl的xsi:type属性,即可完成。它会工作得很好。