DTD -> Преобразование XSD:смешанный список из двух элементов, один ограниченный
Вопрос
Я пытаюсь представить следующий фрагмент DTD в XSD:-
(A | B)* | (A | C)* | (A | D)* | ...
т. е.смешанный список из любого количества As и любого количества один из B, C, D, ...
Кастоконвертер выплевывает:-
<choice>
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="tns:A" />
<element ref="tns:B" />
</choice>
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="tns:A" />
<element ref="tns:C" />
</choice>
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="tns:A" />
<element ref="tns:D" />
</choice>
</choice>
но это выдает мне ошибку синтаксического анализатора.Исследование с помощью Visual Studio выдает следующее предупреждение:-
"Множественное определение элемента "A" приводит к тому, что модель контента становится неоднозначной.Модель контента должна быть сформирована таким образом, чтобы во время проверки последовательности элементов информации об элементе, содержащаяся в ней частица, прямо, косвенно или неявно, с помощью которой можно попытаться проверить каждый элемент в последовательности по очереди, могла быть однозначно определена без изучения содержимого или атрибутов этого элемента и без какой-либо информации об элементах в остальной части последовательности".
Проблема, по-видимому, заключается в том, что если анализатор встретит букву "А", ему нужно будет "заглянуть вперед" к остальной части последовательности, чтобы определить, какой выбор следует проверить.
Есть ли другой способ, которым я могу представить эту последовательность в XSD?
Решение
Используйте последовательности, подобные этой:
<sequence minOccurs="0">
<element minOccurs="0" maxOccurs="unbounded" ref="tns:A" />
<choice>
<sequence>
<element minOccurs="1" maxOccurs="unbounded" ref="tns:B" />
<sequence minOccurs="0" maxOccurs="unbounded">
<element maxOccurs="unbounded" ref="tns:A" />
<element minOccurs="0" maxOccurs="unbounded" ref="tns:B" />
</sequence>
</sequence>
<sequence>
<element minOccurs="1" maxOccurs="unbounded" ref="tns:C" />
<sequence minOccurs="0" maxOccurs="unbounded">
<element maxOccurs="unbounded" ref="tns:A" />
<element minOccurs="0" maxOccurs="unbounded" ref="tns:C" />
</sequence>
</sequence>
<sequence>
<element minOccurs="1" maxOccurs="unbounded" ref="tns:D" />
<sequence minOccurs="0" maxOccurs="unbounded">
<element maxOccurs="unbounded" ref="tns:A" />
<element minOccurs="0" maxOccurs="unbounded" ref="tns:D" />
</sequence>
</sequence>
</choice>
</sequence>
альтернативный текст http://www.freeimagehosting.net/uploads/29c07bafa2.png