2012-05-15 2 views
1

Возможно, я слишком долго смотрел на эту проблему, возможно, нет ответа; в любом случае я здесь.Недостаток модели содержимого в схеме

Я пытаюсь разрешить набор возможных комбинаций в XSD, но я не могу найти подход, который не приводит к двусмысленности.

Быстрый regexy respresentation:

foo+ (bar baz* | bar? baz+ qux*) 
  • foo требуется (один или-более)
  • Если bar существует, baz не является обязательным (нулевой или-более)
  • Если baz существует, bar является необязательным (нулевой или один) и qux не является обязательным (нуль-или-более)
  • qux не может существовать, если baz не существует

Неоднозначность возникает дано foo bar baz.

Неоднозначность XSD документа: захват

<xs:element name="parent"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="foo" minOccurs="1" maxOccurs="unbounded" /> 
      <xs:choice> 
       <xs:sequence> 
        <xs:element name="bar" minOccurs="1" maxOccurs="1" /> 
        <xs:element name="baz" minOccurs="0" maxOccurs="unbounded" /> 
       </xs:sequence> 
       <xs:sequence> 
        <xs:element name="bar" minOccurs="0" maxOccurs="1" /> 
        <xs:element name="baz" minOccurs="1" maxOccurs="unbounded" /> 
        <xs:element name="qux" minOccurs="0" maxOccurs="unbounded" /> 
       </xs:sequence> 
      </xs:choice> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

экран для хорошей меры:

Ambiguous XSD tree


Теперь я начинаю понимать, что, возможно, это просто ограничение модели содержимого XSD. Причина двусмысленности очевидна; решение не так.

Может ли кто-нибудь увидеть средство, с помощью которого я могу это разрешить; путем переопределения элементов путем использования какой-либо схемы проектирования схемы для облегчения неоднозначных сценариев, подобных этому?

Состояние проблемы bar и baz явно проблема, но я не могу придумать другого способа сделать это.

Большое спасибо за внимание.


Edit: В настоящее время чтения «Schema Component Constraint: Unique Particle Attribution» в попытке найти лазейку. Любые другие рекомендуемые чтения приветствуются.

ответ

3

IIRC есть теорема в информатике, в которой говорится, что каждая двусмысленная грамматика может быть переписана как однозначная грамматика, поэтому начните с гипотезы о том, что это возможно. Однако недвусмысленная грамматика иногда может быть ужасно сложной.

Я считаю, что хороший подход к обработке заключается в том, чтобы нарисовать «железнодорожную диаграмму» грамматики, то есть машину конечного состояния с ее переходами.Затем, когда вы находите состояние на этом компьютере, которое имеет два перехода, помеченные одним и тем же символом, вам нужно построить новое состояние, которое принимает оба этих перехода, и так далее. В литературе CS этот алгоритм называется «детерминизация».

Другой подход, который, возможно, проще объяснить без доски, заключается в том, чтобы развернуть то, что является общим для двух ветвей по вашему выбору. Когда вы нажимаете на первый элемент в содержимом, он должен быть либо баром, либо базом. Поэтому напишите два варианта: один начинается с бара и один с baz.

Насколько я могу видеть, ваша модель содержимого euiqvalent к однозначному модели

(bar, (baz+, qux*)?) | (baz+, qux*) 

, но я хотел бы проверить, что тщательно ...

+0

Спасибо @MichaelKay, ваше Рекомендованное выражение работало отлично! (* возможно, мои аналитические способности легли спать, пока я не прошлой ночью *). Я верю, что буду делать обзор стратегий устранения неоднозначности и насильно помню тот факт, что у композиторов тоже в XSD может быть мощность. – Dan

Смежные вопросы