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