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 или два.