#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. Тогда это было бы проблемой 🙂