relaxng: неверное определение схемы?

Я пытаюсь написать схему для некоторых документов XML с использованием RELAX-NG, и когда я использую ее с jing, я получаю сообщение об ошибке, которое не понимаю:

C:\tmp\xml>java -jar jing.jar -c list-test2.rnc list-test.xml
C:\tmp\xml\list-test2.rnc:6:10: error: repeat of "string" or "data" element

Может кто-нибудь объяснить, почему и помочь мне с обходным путем?

Вот образец документа (придуман для простоты):

Список-test.xml:

<?xml version="1.0" encoding="UTF-8"?>
<list-test>
    <list name="list1">
        foo.bar.baz
        quux
        be.bop.a.loo.bop
        <hole name="somename" />
        tutti.frutti
        abc678.foobar
    </list>
    <list name="list2">
        test1
        test2
        test3
        <hole name="hole1" />
        <hole name="hole2" />
        test4
        <hole name="hole3" />
    </list>
</list-test>

Вот схема, которая работает нормально:

Список-test.rnc:

grammar {

start = element list-test { list-test-content }

list-test-content = 
    (element list { list-content })*

list-content =
    attribute name { text },
    (text | hole-element)*

hole-element = 
    element hole { hole-content }

hole-content =
    attribute name { text }

}

но когда я пытаюсь заменить общий text узлы с конкретными текстовыми шаблонами, я получаю ошибку.

Список-test2.rnc:

grammar {

start = element list-test { list-test-content }

list-test-content = 
    (element list { list-content })*

list-content =
    attribute name { identifier },
    (qualified-identifier | hole-element)*

hole-element = 
    element hole { hole-content }

hole-content =
    attribute name { identifier }

identifier =
    xsd:token { pattern="[A-Za-z_][A-Za-z_0-9]*" }

qualified-identifier =
    xsd:token { pattern="[A-Za-z_][A-Za-z_0-9]*(\.[A-Za-z_][A-Za-z_0-9]*)*" }   

}

1 ответ

Решение

Вы столкнулись с одним из основных ограничений RELAX NG: содержимое элемента может быть сложным (с текстовыми шаблонами, шаблонами элементов, шаблонами последовательности, шаблонами чередования и шаблонами квантификаторов) или простым (с шаблонами данных, шаблонами значений и шаблонами списков).), но не оба одновременно. (Конечно, можно выбирать между сложным и простым контентом.)

Вы действительно не можете сделать лучше, чем использовать текст здесь, и, возможно, написать правило Schematron или два.

Другие вопросы по тегам