RelaxNG: , содержащий

#xml #validation #relaxng

#xml #проверка #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>
  

Но при проверке с lxml помощью Python я получаю только сообщения об ошибках Did not expect element subelem1 there .

Что здесь не так?

Комментарии:

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>
  

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

Комментарии:

1. Спасибо за редактирование — у меня также не было пространства имен для элемента выбора в моем rng…

2. Тогда это было бы проблемой 🙂