2

我有一个看起来很像这样的 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-Nmulti标签,但 0-1 optional。只要 multis 在可选之前就可以正常工作,但是由于RNG 中的相对顺序很重要,如果它们在之后出现,它将失败:

有效的:

<xml>
  <optional/>
</xml>

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

无效的:

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

那么我怎样才能允许任意顺序但保留约束呢?我尝试将整个东西包装在一个<zeroOrMore><choice>块中,这允许任意顺序,但也允许任意数量的可选标签通过。

4

1 回答 1

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元素,包括您的示例。

于 2012-05-24T10:08:26.660 回答