好的,我已经修复了您的 XML 示例中的错误。您的架构无法验证您在此处提供的 XML,因为它是错误的。无论如何,这可能至少部分是复制和粘贴错误。我认为您的意思是以下模式(插入了一个或多个标记和序列逗号):
start=
element bookshop
{
element book {attribute bid {xsd:ID}, text}+,
element authors
{
element author { attribute bidref {xsd:IDREF}, text}
}
}
顺便说一句,这种“俄罗斯娃娃”模式非常难以维护。如果您使用的是 RelaxNG,则最好使用命名模式。
现在,您的基本问题是您已经分别对属性bid
和bidref
asID
和as 进行了建模IDREF
。这些类型可以追溯到 DTD。ID 类型被定义为匹配“名称”产品,该产品被定义为(在同一文档中):
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,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}