Разрешение произвольного порядка элементов в схеме RelaxNG

У меня есть схема RelaxNG, которая выглядит примерно так:

<grammar xmlns="http://relaxng.org/ns/structure/1.0">
  <start>
    <element name="xml">
      <zeroOrMore>
        <element name="multi">
          <data type="string"/>
        </element>
      </zeroOrMore>
      <optional>
        <element name="optional">
          <data type="string"/>
        </element>
      </optional>
    </element>
  </start>
</grammar>

Я хочу разрешить 0-N тегов multi, но 0-1 optional. Это работает нормально, пока множители идут перед необязательными, но поскольку в ГСЧ важен относительный порядок, это не удается, если они приходят позже:

Действительный:

<xml>
  <optional/>
</xml>

<xml>
  <multi/>
  <multi/>
  <optional/>
</xml>

Недействителен:

<xml>
  <optional/>
  <multi/>
  <multi/>
</xml>

Итак, как я могу разрешить произвольный порядок, но сохранить ограничения? Я попытался обернуть все это в блок <zeroOrMore><choice>, и это допускает произвольный порядок, но также позволяет пропускать любое количество необязательных тегов.


person lambshaanxy    schedule 24.05.2012    source источник


Ответы (1)


Если я правильно понимаю ваш вопрос, то, чего вы пытаетесь достичь, достигается с помощью шаблона <interleave/>:

<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
    <start>
        <element name="xml">
            <interleave>
                <zeroOrMore>
                    <element name="multi">
                        <data type="string"/>
                    </element>
                </zeroOrMore>
                <optional>
                    <element name="optional">
                        <data type="string"/>
                    </element>
                </optional>                
            </interleave>
        </element>
    </start>
</grammar>

Это проверит любую последовательность или ноль или один элемент optional и ноль или более элементов multi, включая ваши примеры.

person Nic Gibson    schedule 24.05.2012