Возможно ли в языке XML Schema Language (XSD) W3C разрешить ряд элементов в любом порядке, но при этом ограничить вхождения?

StackOverflow https://stackoverflow.com/questions/104248

  •  01-07-2019
  •  | 
  •  

Вопрос

Я знаю о 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, если порядок может быть известен заранее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top