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>

multi0-Nタグを許可したいのですが、 0-1 optional. multi が optional の前にある限り問題なく動作しますが、 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>

これにより、任意のシーケンスまたは 0 個または 1 個の要素と、例を含むoptional0 個以上の要素が検証されます。multi

于 2012-05-24T10:08:26.660 に答える