我知道标题可能令人困惑。这里有一些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模式中执行此操作?欢迎任何建议或替代方法。
答案 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属性,即可完成。它会工作得很好。