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, даже не уверен, когда.
В любом случае, вот мои два вопроса:
- Является ли такой xsd законным ? deterministi c? следовать правилу уникальной атрибуции частиц (UPA)? или какой-то бог знает, что за другая терминология?
- Если это допустимый xsd, как может синтаксический анализатор sax / stax сказать, когда текущий элемент соответствует чему-либо, что-нибудь? Не сам синтаксический анализатор, ему все равно, но вызывающая сторона, которая должна интерпретировать текущий элемент. Я думаю, что он должен знать также следующие элементы, прежде чем он сможет принять правильное решение (выбрать наилучшее совпадение), который для sax / stax невозможен только на основе текущего элемента.
ps: пытаюсь создать инструмент отображения xml (не спрашивайте почему), и я не знаю, как сопоставить проанализированное содержимое со структурой xsd при таких обстоятельствах.
Большое спасибо