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

Я знаю о all и choice, но они не учитывают случай, когда я хочу, чтобы некоторые элементы могли появляться несколько раз, например:

<Root>
    <ThingA/>
    <ThingB/>
    <ThingC/>
    <ThingC/>
    <ThingC/>
</Root>

Я мог бы использовать sequence, но я бы предпочел, чтобы эти дети были в любом порядке. Я мог бы использовать any, но тогда я не мог иметь более одного ThingC. Я мог бы использовать choice, но тогда я не мог ограничить ThingA и ThingB до 0 или 1.

Мне кажется, я где-то читал, что это было сложно или невозможно в XSD, но возможно с RELAX NG. К сожалению, я не помню, где я это читал.

Спасибо за любую помощь!

1 Ответ

6 голосов
/ 19 сентября 2008

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

...