Возможно ли в языке XML Schema Language (XSD) W3C разрешить ряд элементов в любом порядке, но при этом ограничить вхождения?
Вопрос
Я знаю о all
и choice
, но они не учитывают случай, когда я хочу, чтобы некоторые элементы могли встречаться более одного раза, например:
<Root>
<ThingA/>
<ThingB/>
<ThingC/>
<ThingC/>
<ThingC/>
</Root>
Я мог бы использовать sequence
, но я бы предпочел, чтобы эти дети располагались в любом порядке.Я мог бы использовать any
, но тогда у меня не могло быть больше одного ThingC
.Я мог бы использовать choice
, но тогда я не мог ограничить ThingA
и ThingB
до 0 или 1.
Я думаю, я где-то читал, что это было либо сложно, либо невозможно в XSD, но могло быть возможно с RELAX NG.К сожалению, я не помню, где я это прочитал.
Спасибо за любую помощь!
Решение
Это верно:вы не можете делать то, что хотите, в XML-схеме, но вы можете в RELAX NG с помощью:
<element name="Root">
<interleave>
<element name="ThingA"><empty /></element>
<element name="ThingB"><empty /></element>
<oneOrMore><element name="ThingC"><empty /></element></oneOrMore>
</interleave>
</element>
Вашими параметрами в XML-схеме являются:
- добавьте этап предварительной обработки, который нормализует ваш входной XML-файл в определенном порядке, а затем используйте
<xs:sequence>
- использование
<xs:choice>
, и добавьте дополнительную проверку (например, с помощью Schematron), чтобы проверить, что существует не более одного<ThingA>
или<ThingB>
- решите исправить порядок элементов в вашем языке разметки
Получается, что третий вариант обычно является наилучшим;генераторы XML обычно не требуют больших затрат на вывод элементов в определенном порядке, и это не только помогает проверке, но и облегчает использование XML, если порядок может быть известен заранее.