Пример расширения сложных типов в XSD? - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь использовать данные внутри элемента, не нарушая существующий контракт этого элемента.
Давайте упростим мой случай:

<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 голосов
/ 11 июня 2018

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

0 голосов
/ 10 июня 2018

Вы можете использовать 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>
...