Используйте 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, а не элементы. Как расширить элемент? (могу ли я расширить элемент?)
Ответы
Ответ 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" />