RelaxNG:<choice>包含<zeroormore> </zeroormore> </choice>

时间:2011-10-26 10:02:22

标签: xml validation relaxng

在RelaxNG中,我想描述一个类似于此的结构:

<parent>
    <subelem1>
    <subelem1>
    <subelem1>
    ...
</parent>

或:

<parent>
    <subelem2>
    <subelem2>
    <subelem2>
    ...
</parent>

我尝试了以下rng:

<rng:element name="parent">
    <rng:choice>
        <rng:zeroOrMore>
            <rng:ref name="subelem1"/>
        </rng:zeroOrMore>
        <rng:zeroOrMore>
            <rng:ref name="subelem2"/>
        </rng:zeroOrMore>
    </rng:choice>
</rng:element>

但是在Python中使用lxml验证,我只收到错误消息Did not expect element subelem1 there

那里有什么问题?

1 个答案:

答案 0 :(得分:1)

我使用了与你的模式略有不同的模式,但功能应该相同:

<rng:grammar 
    xmlns:rng="http://relaxng.org/ns/structure/1.0"
    xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"
    datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
    <rng:start>
        <rng:ref name="dparent"/>
    </rng:start>

    <rng:define name="dparent">
    <rng:element name="parent">
        <rng:choice>
            <rng:zeroOrMore>
                <rng:element name="subelem2">
                    <rng:empty/>
                </rng:element>
            </rng:zeroOrMore>
            <rng:zeroOrMore>
                <rng:element name="subelem1">
                    <rng:empty/>
                </rng:element>
            </rng:zeroOrMore>
        </rng:choice>
    </rng:element>

    </rng:define>

使用jingxmllint(如果我没记错的话,使用libxml2和python中的lxml一样)可以很好地验证你的样本文档。我建议比较你的完整语法(我假设你只发布了部分内容)和上面的内容。此外,我更正了您的命名空间(choice元素不在一个)。如果你仍然无法验证我会建议问题是lxml而不是语法。