Допустим, в схеме есть следующее:
<xsd:complexType name="shape"/>
<xsd:complexType name="circle">
<xsd:complexContent>
<xsd:extension base="shape">
<xsd:attribute name="radius" type="xsd:double"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="arc">
<xsd:complexContent>
<xsd:extension base="circle">
<xsd:attribute name="startAngle" type="xsd:double"/>
<xsd:attribute name="endAngle" type="xsd:double"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
Затем можно добавить группу замещения, подобную этой
<xsd:element name="shape" type="shape" abstract="true"/>
<xsd:element name="circle" type="circle" substitutionGroup="shape"/>
<xsd:element name="arc" type="arc" substitutionGroup="shape"/>
, а затем принять любой из этих типов, ссылаясь на группу как:
<xsd:element ref="shape"/>
Эта часть не проблема.
Но что, если я также хочу разрешить (в другом разделе) просто кружок и его подтип?
Можно ли добавить несколько групп замещения, чтобы эмулировать правильное наследование в схеме? Я попытался добавить другой тип элемента, например:
<xsd:element name="shape" type="shape" abstract="true"/>
<xsd:element name="circle" type="circle" substitutionGroup="shape"/>
<xsd:element name="arc" type="arc" substitutionGroup="shape"/>
<xsd:element name="arc2" type="arc" substitutionGroup="circle"/>
Но я бы предпочел не менять имя ожидаемого элемента в зависимости от того, что я ожидаю.
Есть ли лучший способ сделать это?