Ваше решение не является детерминированным, потому что
<element>
<two/>
</element>
- это один из случаев, который соответствует обеим ветвям: (one*, two*)
и (two*, one*)
.
Как заметил @Cristopher, ответ @ Dave допускает смешанное упорядочение, и его ответ решает эту проблему. Но на самом деле ответ Кристофера тоже не детерминированный , потому что при проверке ввода
<element>
<two/>
</element>
и валидатор встречает первый <two>
, который не знает, какую ветку он должен выбрать. Он знает это только после прочтения всех элементов <two>
.
Чтобы сохранить порядок при сохранении детерминированности модели, используйте
<!ELEMENT element ( (one+, two*) | (two+, one*) )? >
Ключевыми моментами здесь являются: 1) сохранение модели детерминированной, начиная каждую ветвь с различным обязательным элементом 2), но при этом оставляя пустым <element/>
с ?
в конце, что делает модель содержимого необязательной.