1

在 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>

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

那里有什么问题?

4

1 回答 1

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出在语法上而不是语法上。

于 2011-10-26T14:33:16.553 回答