relaxng:架构定义无效?

时间:2011-02-18 17:54:43

标签: xml relaxng

我正在尝试使用RELAX-NG为一些XML文档编写模式,当我将它与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 个答案:

答案 0 :(得分:3)

你遇到了RELAX NG的一个基本限制:元素的内容可能很复杂(包括文本模式,元素模式,序列模式,交错模式和量词模式)或简单(使用数据模式,值模式,和列表模式),但不是两个同时。 (当然,可以在复杂和简单的内容之间进行选择。)

你真的不能在这里使用文本,也许写一两个Schematron规则。