允许RelaxNG模式中的任意元素顺序

时间:2012-05-24 02:51:51

标签: validation xsd 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。只要multis在可选项之前就可以正常工作,但是从relative order matters in RNG开始,如果它们之后出现则会失败:

有效:

<xml>
  <optional/>
</xml>

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

无效:

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

那么如何允许任意顺序但保留约束呢?我尝试将整个事件包装在<zeroOrMore><choice>块中,这允许任意顺序,但也允许任意数量的可选标记通过。

1 个答案:

答案 0 :(得分:4)

如果我正确理解了您的问题,那么您要实现的目标是通过使用<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元素,包括您的示例。