RelaxNG: <choice>содержащий <zeroOrMore> - PullRequest
1 голос
/ 26 октября 2011

В 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.

Что там не так?

1 Ответ

1 голос
/ 26 октября 2011

Я использовал схему немного отличную от вашей, но функциональность должна быть такой же:

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

Это прекрасно проверяет оба ваших образца документов, используя jing , а также с xmllint (который использует libxml2, как и lxml в python, если я правильно помню).Я бы посоветовал сравнить вашу полную грамматику (я полагаю, вы разместили только ее часть) с приведенным выше.Также я исправил ваши пространства имен (элемент choice не был в одном).Если вы все еще не можете подтвердить, я бы предложил проблему с lxml, а не с грамматикой.

...