В дополнение к методике, описанной @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 в элементе экземпляра, если только вы не заблокируете его.Они также могут иметь разные результаты, если вы используете инструменты привязки данных (я не знаю), и вы можете почувствовать, что они имеют разную «семантику» с точки зрения моделирования реальных отношений между представленными объектами.