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

时间:2018-06-10 15:46:37

标签: xml xsd xsd-validation xml-validation

我正在尝试使用元素中的数据,而不会破坏此元素的现有合约 让我们简化一下案例:

<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方法,我可以保持第一个合同相同并将其内部数据提取到我的新合同中?

2 个答案:

答案 0 :(得分:1)

您可以使用xs:extensionNewContractType扩展ExistingContractType

<?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>

答案 1 :(得分:1)

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

<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,则可以使用通过扩展派生的类型代替基类型,除非您阻止它。如果您使用数据绑定工具(我不知道),它们可能也会有不同的结果,您可能会觉得它们有不同的语义和#34;在模拟被表示对象之间的真实世界关系方面。