2011-02-18 55 views
2

我想写使用RELAX-NG一些XML文档的架构,当我与荆使用它,我得到一个错误信息,我不明白:relaxng:无效的模式定义?

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]*)*" } 

} 

回答

2

你撞到了对RELAX NG的基本限制之一:元素的内容可以是复杂的(与文本模式,元素模式,序列模式,交织模式,和量词模式)或简单的(与数据模式,值模式和列表模式),但不是同时。 (当然,可以在复杂内容和简单内容之间进行选择。)

你真的无法做到比在这里使用文本更好,也许写一个Schematron规则或两个。