Подтвердить что ты не робот

Используйте XML-схему для расширения элемента, а не complexType

Предположим, что у меня есть схема:

<xsd:schema ...>
    <xsd:element name="foo">
         <xsd:complexType>
             <xsd:sequence>
                 <xsd:element name="fooElement" type="xs:string" />
             </xsd:sequence>
         </xsd:complexType>
    </xsd:element>
</xsd:schema>

Это определяет некоторый элемент foo, который содержит внутри него некоторый элемент fooElement с строкой типа. Я хотел бы расширить элемент foo, чтобы иметь элемент barElement и вызвать это расширение bar.

Чтобы усложнить ситуацию, давайте предположим, что кто-то еще определил foo, и схема не может быть изменена. Хотя пример здесь тривиален, допустим также, что содержимое foo может быть более сложным и что определение новой схемы не так просто, как копирование элемента fooElement.

Фактически, я бы хотел определить новую схему:

<xsd:schema xmlns:fns="otherschema" ...>
    <xsd:import namespace="otherschema" />
    <xsd:element name="bar">
         <xsd:complexContent>
             <xsd:extension base="fns:foo">
                 <xsd:sequence>
                     <xsd:element name="barElement" type="xs:string" />
                 </xsd:sequence>
             </xsd:extension>
         </xsd:complexContent>
    </xsd:element>
</xsd:schema>

К сожалению, атрибут <xsd:extension> base принимает только аргументы типа XSD, а не элементы. Как расширить элемент? (могу ли я расширить элемент?)

4b9b3361

Ответ 1

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

  <xs:complexType name="fooType">
    <xs:sequence>
      <xs:element name="fooElement" type="xs:string" />
    </xs:sequence>
   </xs:complexType>

   <xs:complexType name="barType">
    <xs:complexContent mixed="false">
      <xs:extension base="fooType">
        <xs:sequence>
          <xs:element name="barElement" type="xs:string" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:element name="bar" type="barType" />