我正在尝试使用元素中的数据,而不会破坏此元素的现有合约 让我们简化一下案例:
<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方法,我可以保持第一个合同相同并将其内部数据提取到我的新合同中?
答案 0 :(得分:1)
您可以使用xs:extension
从NewContractType
扩展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;在模拟被表示对象之间的真实世界关系方面。