Xsd与多重继承

Xsd与多重继承,xsd,multiple-inheritance,Xsd,Multiple Inheritance,很抱歉问这么长的问题。我会尽量让它变得简单。 我们正在开发一个模块化的计算框架。框架从xml文件读取配置,我们希望根据xsd验证配置。在添加新模块时,我们希望xsd在可维护性方面尽可能简单。 框架的结构如下(用c#表示): 我们有各种模块接口的抽象实现和模块的实现(例如ObjLoader:AbstractSource)。xml的结构如下所示: <Test> <Sources> <ObjLoader .../> </Sourc

很抱歉问这么长的问题。我会尽量让它变得简单。 我们正在开发一个模块化的计算框架。框架从xml文件读取配置,我们希望根据xsd验证配置。在添加新模块时,我们希望xsd在可维护性方面尽可能简单。 框架的结构如下(用c#表示):

我们有各种模块接口的抽象实现和模块的实现(例如ObjLoader:AbstractSource)。xml的结构如下所示:

<Test>
    <Sources>
       <ObjLoader .../>
    </Sources>
    <Filters>
       ...
    </Filters>
    <Processors>
    ...
</Test>
有没有办法修改我们的xsd,使其能够处理可以替换多个抽象元素的元素?比如:

<xs:element name="GreatProcessingFilter" 
            substitutionGroup="AbstractProcessor" 
            substitutionGroup="AbstractFilter"> ... 
。。。

XSD 1.1不允许在
substitutionGroup
属性中使用多个QName。但是,它不会导致声明为多个替换组成员的元素被赋予一个从分配给各个替换组头的类型动态构造的类型。因此,在您所寻找的意义上,它可能不符合多重继承的条件。你可能会感兴趣


[另外,回应OP的评论]在XSD 1.1中,一个顶级元素可以用多个替换组声明;然后可以将其替换为命名的任何元素(除非被替换组标题上的相关
final
属性阻止)。替代组从属关系的约束如1.0所示:所声明元素的类型必须能够有效地替代每个替代组头的类型。如果没有为元素指定类型,则默认为与第一个替换组头具有相同的类型。

XSD 1.1允许在
substitutionGroup
属性中使用多个QName。但是,它不会导致声明为多个替换组成员的元素被赋予一个从分配给各个替换组头的类型动态构造的类型。因此,在您所寻找的意义上,它可能不符合多重继承的条件。你可能会感兴趣


[另外,回应OP的评论]在XSD 1.1中,一个顶级元素可以用多个替换组声明;然后可以将其替换为命名的任何元素(除非被替换组标题上的相关
final
属性阻止)。替代组从属关系的约束如1.0所示:所声明元素的类型必须能够有效地替代每个替代组头的类型。如果没有为元素指定类型,则默认为与第一个替换组组长的类型相同。

谢谢您的回答。您能告诉我更多关于替换组中多个QName的可能性吗?请参阅答案的添加。谢谢您的添加。。。我可能会想其他办法谢谢你的回答。您能告诉我更多关于替换组中多个QName的可能性吗?请参阅答案的添加。谢谢您的添加。。。我可能会想办法找到别的办法
<xs:include schemaLocation="framework.xsd"/>
<xs:include ... modules /> 
<!-- adding includes for every module or group 
of modules is the only modification -->

<xs:element name="Test">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="this:Sources" 
                  minOccurs="1" 
                  maxOccurs="1"/>
      ...
    </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:element name="Sources">
  <xs:complexType>
    <xs:choice maxOccurs="unbounded">
      <xs:element ref="this:AbstractSource"/>
    </xs:choice>
  </xs:complexType>
</xs:element>

<xs:element name="AbstractSource" 
            abstract="true"/>  

<xs:complexType name="ISource">
  <xs:complexContent>
    <xs:extension base="this:IModule">
      ...
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
...
<xs:include schemaLocation="framework.xsd"/>

<xs:element name="ObjLoader" 
    substitutionGroup="this:AbstractSource">
  <xs:complexType>
    <xs:complexContent>
      <xs:extension base="this:ISource">
        ...
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:element>
class GreatProcessingFilter : AbstractProcessor, 
                              IFilter { ... }
<xs:element name="GreatProcessingFilter" 
            substitutionGroup="AbstractProcessor" 
            substitutionGroup="AbstractFilter"> ...