Неоднозначности XSD, несколько композиторов в одном сложном типе - PullRequest
0 голосов
/ 09 апреля 2020

XSD сложные типы, ну ... сложные

Сначала некоторые факты:

  • элементы могут иметь minOccurs, maxOccurs и могут быть дочерними
  • compositors ( Выбор / все / последовательность) могут иметь свои собственные minOccurs / maxOccurs
  • Несколько композиторов могут использоваться в строке в одном и том же сложном типе
  • и даже больше, композиторы могут быть вложенными (например, выбор между 2 последовательности)

Из-за всего этого, я думаю, это возможно в xsd / xml (псевдо-xsd):

<someComplexType>
    <sequence minOccurs=0>
      <element A>
      <element B>
    </sequence>
    <sequence>
      <element A>
      <element C>
    </sequence>
</someComplexType>

Не уверен, что это законно, но это возможно.

Теперь, скажем, синтаксический анализатор sax / stax видит элемент A.

Что будет дальше? Как мне определить, является ли это A из первой последовательности или A из второй последовательности ... перед проверкой следующего элемента (ов)?

Если следующий элемент - B этот A, вероятно, должен (!) совпадать с первой последовательностью.

Если следующим элементом является C, то же A, вероятно, (!) должен совпадать со второй последовательностью.

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

При аналогичном xsd при синтаксическом анализе xml (я думаю) невозможно определить, принадлежит ли текущий элемент указанному c композитору или нет, пока ... .later, даже не уверен, когда.

В любом случае, вот мои два вопроса:

  1. Является ли такой xsd законным ? deterministi c? следовать правилу уникальной атрибуции частиц (UPA)? или какой-то бог знает, что за другая терминология?
  2. Если это допустимый xsd, как может синтаксический анализатор sax / stax сказать, когда текущий элемент соответствует чему-либо, что-нибудь? Не сам синтаксический анализатор, ему все равно, но вызывающая сторона, которая должна интерпретировать текущий элемент. Я думаю, что он должен знать также следующие элементы, прежде чем он сможет принять правильное решение (выбрать наилучшее совпадение), который для sax / stax невозможен только на основе текущего элемента.

ps: пытаюсь создать инструмент отображения xml (не спрашивайте почему), и я не знаю, как сопоставить проанализированное содержимое со структурой xsd при таких обстоятельствах.

Большое спасибо

1 Ответ

1 голос
/ 09 апреля 2020

Как вам скажет любой XSD-процессор, ваша модель контента недопустима, потому что она неоднозначна именно по тем причинам, которые вы описываете. (Это нарушает ограничение УПА). Содержимое может (и должно) быть изменено с (AB | AC) на A (B|C).

. Конечно, существуют похожие технологии (такие как процессоры регулярных выражений или RelaxNG), где допускаются неоднозначные грамматики: для их анализа требуется такие методы, как прогнозирование или возврат.

Если вы планируете реализовать процессор, который выполняет эту задачу, я бы порекомендовал почитать некоторые из компьютерных наук. Стандартный учебник - очень старый, но все же отлично используемый - это «Книга Дракона» Ахо и Ульмана (не помню названия, и я оставил свой экземпляр в офисе). Более конкретно, в отношении XSD, есть несколько хороших работ Томпсона и Тобина, которые можно найти на веб-сайте Генри Томпсона в Эдинбургском университете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...