Xml RELAXNG架构中的xsd:ID

Xml RELAXNG架构中的xsd:ID,xml,schema,xsd,relaxng,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&g

我有以下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>

但是,它总是给我一个错误,即属性bid的值无效必须是一个没有冒号的XML名称。好的,我已经修复了XML示例中的错误。您的模式无法验证您在那里提供的XML,因为它是错误的。无论如何,这可能至少部分是复制粘贴错误。我认为您指的模式如下(插入一个或多个标记和序列逗号):

顺便说一句,这种“俄罗斯娃娃”模式是无法维护的。如果您使用的是RelaxNG,那么最好使用命名模式

现在,这里的基本问题是,您分别将属性
bid
bidref
建模为
ID
IDREF
。这些类型可以追溯到DTD。定义的ID类型(在同一文档中)如下所示:

简单来说就是“你不能用一个数字开始一个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}

嗨,尼克。我知道这个线程有点老了,但我一直在用头撞击xsd:ID,不允许在ID attr中使用冒号(:)。大多数W3页面,比如您链接到的页面,都表明冒号是有效的。然后我发现了这一点,我认为它的意思是:“你不应该在id属性中使用冒号,但你应该被允许使用。”鉴于这种解释,我很困惑为什么JING说我不能。我希望这是一个有价值的评论。谢谢。嗨,扎卡里,你最近不是在什么地方问这个问题吗?或者我是这么想的?对于评论来说,解释有点复杂——问一个问题,我会尽力解释!
start=

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

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

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