DTD -> Преобразование XSD:смешанный список из двух элементов, один ограниченный

StackOverflow https://stackoverflow.com/questions/1086513

  •  23-08-2019
  •  | 
  •  

Вопрос

Я пытаюсь представить следующий фрагмент 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top