Я не нашел примеров, где элементы xsd (/ сложные типы) расширяются и переопределяются таким образом, но вы можете сделать это, когда Subclass1
и Subclass2
(и Superclass
) находятся в разных «определениях».Вы должны xs:override
Superclass
в обоих «sub-xsds» (один с B и один с типом C), а затем расширить их соответственно:
parent.xsd:
<xsd:complexType name="Superclass">
<xsd:sequence>
<xsd:element name="prop" type="A" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
sub1.xsd:
<xs:override schemaLocation="parent.xsd">
<xsd:complexType name="Superclass">
<xsd:sequence>
<xsd:element name="prop" type="B" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xs:override>
<!-- and just : -->
<xsd:complexType name="Subclass1">
<xsd:complexContent>
<xsd:extension base="Superclass"/>
<xsd:attribute name="someAttribute" type="xsd:string"/>
</xsd:complexContent>
</xsd:complexType>
и sub2.xsd:
<xs:override schemaLocation="parent.xsd">
<xsd:complexType name="Superclass">
<xsd:sequence>
<xsd:element name="prop" type="C" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xs:override>
<xsd:complexType name="Subclass2">
<xsd:complexContent>
<xsd:extension base="Superclass"/>
<xsd:attribute name="someOtherAttribute" type="xsd:int"/>
</xsd:complexContent>
</xsd:complexType>
Это должно быть в разных определениях, потому что я не знаю, как преодолеть "конфликт имен""(Суперкласс =? Суперкласс), но, может быть, у кого-то есть идея?... показывает лучший / N альтернативный способ.
Это решение так же просто / сложно, как «определение SuperclassB и SuperclassC».(ставя под сомнение необходимость суперкласса!)