Если я правильно понимаю, вы хотите, чтобы вы могли написать схему следующим образом:
<!-- WARNING: this is not valid Schema -->
<xs:complexType name="composite-key">
<xs:choice maxOccurs="unbounded">
<xs:element name="key" type="simple-key"/>
<xs:element name="key" type="composite-key"/>
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
простой ключ будет определен в другом месте. Это недопустимая схема, поскольку вам не разрешено использовать одно и то же имя элемента дважды. Если бы Схема поддерживала это, она имела бы черт времени, устраняющий неоднозначность типов элементов, основываясь только на их структуре.
Если у вас есть контроль над XML, вы можете сделать это, изменив одно или оба имени элемента. Например, можно использовать val для простых значений и obj для составных:
<xs:complexType name="composite-key">
<xs:choice maxOccurs="unbounded">
<xs:element name="val" type="simple-key"/>
<xs:element name="obj" type="composite-key"/>
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
Настройте имена по вкусу. Это было бы мое рекомендуемое решение, поскольку оно подчеркивает ясность. Однако имена элементов могут быть вне вашего контроля. Если это так, менее удовлетворительное решение будет следующим:
<xs:complexType name="key" mixed="true">
<xs:sequence maxOccurs="unbounded">
<xs:element name="key" type="key"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="type" type="xs:string"/>
<xs:attribute name="representation" type="xs:string"/>
</xs:complexType>
Ключевыми различиями здесь являются тип контента смешанный и прискорбный факт, что объявление теперь является смесью простых и составных типов ключей. Я говорю, что это «менее удовлетворительно», потому что теперь вы должны выполнить дополнительную проверку достоверности в своем собственном коде после того, как схема закончит с ним. Например, вам необходимо проверить, имеет ли смысл данный набор атрибутов для подразумеваемого типа ключа. Кроме того, приведенный пример позволит тексту появляться между вложенными ключевыми элементами - возможно, это то, что вам не нужно.
[править: тот же вопрос обсуждается в stackoverflow здесь ]