Существует способ сделать это, основанный на том факте, что выбор внутри выбора действует как больший выбор.
Сначала определите группу элементов, которая содержит один выбор из всех элементов базового элемента:
<xs:group name="common_ab_elements">
<xs:choice>
<xs:element name="a"/>
<xs:element name="b"/>
</xs:choice>
</xs:group>
Затем вы можете использовать это в своем определении abElement вместо элементов, которые у вас были раньше:
<xs:complexType name="abType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="common_ab_elements"/>
</xs:choice>
</xs:complexType>
Если вам нужен расширенный тип, то вы можете расширить выбор:
<xs:complexType name="abcType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="common_ab_elements"/>
<xs:element name="c"/>
</xs:choice>
</xs:complexType>
Это эквивалентно:
<xs:complexType name="abcType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:choice>
<xs:element name="a"/>
<xs:element name="b"/>
</xs:choice>
<xs:element name="c"/>
</xs:choice>
</xs:complexType>
А из-за характера операции выбора это, в свою очередь, эквивалентно:
<xs:complexType name="abcType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="a"/>
<xs:element name="b"/>
<xs:element name="c"/>
</xs:choice>
</xs:complexType>
... что вы и хотите.
Если у вас также есть атрибуты, то вам также может потребоваться определить общий базовый класс, который вы можете расширить. При использовании этой схемы элементы должны иметь классы, не имеющие производных классов, поскольку именно наличие элементов в базовых элементах вызывает последовательность.
То, что мы эффективно делаем здесь, - это определение наследования элементов выбора отдельно от самой иерархии элементов.