Я думал, что вернусь к этому, так как предыдущий ответ неверен.
Фактически, можно решить исходную проблему, используя XML-схему.
Правильный подход заключается в определении группового элемента, который содержит выбор между всеми различными опциями (целочисленные значения, числа с плавающей запятой, массивы), и каждый из них имеет мощность 0 .. *.
<xs:group name="dataTypesGroup">
<xs:choice>
<xs:element name="int" type="intType"/>
<xs:element name="float" type="floatType"/>
<xs:element name="array">
<xs:complexType>
<xs:choice>
<xs:element name="int" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="float" type="xs:float" minOccurs="0" maxOccurs="unbounded"/>
</xs:choice>
<xs:attribute name="id" use="required"></xs:attribute>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:group>
Здесь осталось сослаться на группу в определении complexType и установить мощность группы равной 0 .. *
<xs:element name="data" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:group ref="dataTypesGroup" minOccurs="0" maxOccurs="unbounded"/>
</xs:complexType>
</xs:element>
и вуаля. немного многословно (особенно по сравнению с синтаксисом RelaxNG), но положительным моментом является то, что XML-схема гораздо лучше поддерживается. Я создал парсер на основе RelaxNG для решения исходной проблемы, но доступные валидаторы (например, JING) довольно неуклюжи, чем использование инструментов на основе XML-схемы, которые поставляются с Java и др.