Звучит так, будто вам нужен мета-формат, в котором схема определяет способ определения столбцов вместо определения отдельных столбцов.
Этот тип xml имеет тенденцию быть уродливым и многословным (например, рассмотрим xmlrpc и мыло). Это также означает, что схема не может проверять фактические столбцы, и только то, что они были определены правильно.
XML будет выглядеть примерно так:
<DataTable>
<column name="..." value="..."/>
<column name="..." value="..."/>
</DataTable>
XSD будет выглядеть примерно так:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="DataTable">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="column">
<xs:complexType>
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="value" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Конечно, если вам нужны структурированные значения (а не только строки), вам понадобится нечто более сложное. Если вам нужны произвольные объекты, они могут быть представлены в виде карты для каждого объекта со значениями, которые могут быть отображены по очереди и т. Д. Определение схемы элемента должно быть рекурсивным, поэтому оно может содержать другой экземпляр самого себя. Это в основном то, что делают xmlrpc и мыло.
РЕДАКТИРОВАТЬ Это не соответствует вашим "столбцам", но пример:
<object name="contact">
<object name="home">
<object name="tel">
<string name="area" value="910"/>
<string name="num" value="1234 5678"/>
</object>
</object>
<object name="work">
<object name="tel">
<string name="area" value="701"/>
<string name="num" value="8888 8888"/>
</object>
<object name="fax">
<string name="area" value="701"/>
<string name="num" value="9999 9999"/>
</object>
</object>
</object>
Основная идея грамматики:
V --> string | O // a Value is a string or an Object
O --> (K V)* // an Object is list of named values (Key-Value pairs)
Изменено, поэтому корень всегда является объектом и называется:
O ==> (string K | O)* K
XSD для этого:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="object">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="string">
<xs:complexType>
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="value" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element ref="object"/>
</xs:choice>
<xs:attribute name="name" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>