xsd:Relax NG Schema中的ID

时间:2011-02-22 17:30:29

标签: xml schema xsd relaxng

我有以下xml文件

<bookshop>
<book bid="1"> Programming in C# </book>
<book bid="2"> programming in Java </book>
<authors>
 <author bidref="1"> person1 </author>
 <author bidref="2"> person2 </author>
 <author bidref="1"> person3 </author>
</authors>
</bookshop>

然后我做了以下Relax NG架构

start=element bookshop{
element book {attribute bid{xsd:ID},
              text}
element authors{
    element author { attribute bidref{xsd:IDREF},
                         text}
               }}

但是,它总是给我错误说属性出价的值无效必须是没有冒号的XML名称

1 个答案:

答案 0 :(得分:2)

好的,我已经修复了XML示例中的错误。您的架构无法验证您在那里提供的XML,因为它是错误的。无论如何,这可能至少部分是复制和粘贴错误。我认为你的意思是下面的模式(插入一个或多个标记和序列逗号):

start=

element bookshop
{
    element book {attribute bid {xsd:ID}, text}+,

    element authors
    {
        element author { attribute bidref {xsd:IDREF}, text}
    }

}

顺便说一句,这种“俄罗斯娃娃”架构非常难以维护。如果你使用的是RelaxNG,你最好使用命名模式。

现在,您的根本问题是您已将属性bidbidref分别建模为IDIDREF。这些类型可以追溯到DTD。 ID类型定义为as matching the 'Name' production,其定义(在同一文档中)为:

NameStartChar ::=       ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | 
    [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | 
    [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | 
    [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | 
    [#x203F-#x2040]
Name     ::= NameStartChar (NameChar)*

简单来说,“你不能用一个数字开始一个ID,也不能只是一个数字”。 XML ID(和IDREF)值必须以字母开头。

你的架构,顺便说一句,可能更好地表达为:

bookshop.content = (book+, authors)
bookshop = element bookshop {bookshop.content}

book.bid = attribute bid {xsd:ID}
book.content = (book.bid, text)
book = element book {book.content}

authors.content = author+ 
authors = element authors {authors.content}

author.bidref = attribute bidref {xsd:IDREF}
author.content = (author.bidref, text)
author = element author {author.content}