在 XSD 中扩展复杂类型的示例?

Example of extending complex types in XSD?

我正在尝试在不破坏此元素现有合同的情况下使用元素中的数据。
让我们简化我的案例:

<xs:element name="ExistingContract">
     <xs:complexType>
          <xs:sequence>
               <xs:element name="first" type="FirstType"/>
               <xs:element name="second" type="SecondType"/>
          </xs:sequence> 
      </xs:complexType>
</xs:element>

<xs:element name="NewContract">
     <xs:complexType>
          <xs:sequence>
               <xs:element name="first" type="FirstType"/>
               <xs:element name="second" type="SecondType"/>
               <xs:element name="additionalData" type="AdditionalDataType"/>
          </xs:sequence> 
      </xs:complexType>
</xs:element>

这两个内部类型是重复的,我想避免它。由于内部数据没有任何现有的包装 xs:complexType,我可以从 ExistingContract 中取出它并在我的 NewContract 中使用它。但是我会破坏第一份合同(我不想这样做)。

你是否熟悉任何XSD方法可以让我保持第一个合约不变并将其内部数据提取到我的新合约中?

您可以使用 xs:extensionExistingContractType 扩展 NewContractType:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="ExistingContract" type="ExistingContractType"/>

  <xs:complexType name="ExistingContractType">
    <xs:sequence>
      <xs:element name="first" type="FirstType"/>
      <xs:element name="second" type="SecondType"/>
    </xs:sequence> 
  </xs:complexType>

  <xs:complexType name="NewContractType">
    <xs:complexContent>
      <xs:extension base="ExistingContractType">
        <xs:sequence>
          <xs:element name="additionalData" type="AdditionalDataType"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:element name="NewContract" type="NewContractType"/>

  <xs:complexType name="FirstType"/>
  <xs:complexType name="SecondType"/>
  <xs:complexType name="AdditionalDataType"/>

</xs:schema>

除了@kjhughes 描述的技术之外,您还可以使用命名模型组:

<xs:group name="common">
    <xs:sequence>
      <xs:element name="first" type="FirstType"/>
      <xs:element name="second" type="SecondType"/>
    </xs:sequence>
</xs:group> 

<xs:complexType name="ExistingContractType">
   <xs:sequence>
    <xs:group ref="common"> 
   </xs:sequence>
</xs:complexType>

<xs:complexType name="NewContractType">
   <xs:sequence>
    <xs:group ref="common">
    <xs:element name="additionalData" type="AdditionalDataType"/> 
   </xs:sequence>
</xs:complexType>

从可维护性的角度来看,这两者非常相似。在实例验证方面存在差异:如果您在实例元素上指定 xsi:type ,则可以使用扩展派生的类型代替基本类型,除非您阻止它。如果您使用数据绑定工具(我不知道),它们也可能会有不同的结果,并且您可能会觉得它们在对所表示对象之间的真实世界关系建模方面有不同 "semantics"。