xsd: ID в схеме Relax NG - PullRequest
       40

xsd: ID в схеме Relax NG

1 голос
/ 22 февраля 2011

У меня есть следующий 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}
               }}

Однако, это всегда дает мне ошибку, в которой указано, что значение атрибута bid невернодолжно быть именем XML без двоеточий

1 Ответ

2 голосов
/ 23 февраля 2011

ОК, я исправил ошибки в вашем примере с XML.Ваша схема не может проверить XML, который вы там дали, потому что, ну, это неправильно.В любом случае, это, по крайней мере, отчасти ошибка копирования и вставки.Схема, которую, я думаю, вы имеете в виду, находится ниже (одна или несколько вставленных меток и запятая последовательности):

start=

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

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

}

Кстати, такая схема «русской куклы» ужасно не поддерживается.Если вы используете RelaxNG, вам лучше использовать именованные шаблоны.

Теперь ваша фундаментальная проблема заключается в том, что вы смоделировали атрибуты bid и bidref как ID и IDREFсоответственно.Эти типы возвращаются к DTD.Тип идентификатора определен как совпадающий с производством «Имя» , которое определено (в том же документе) как:

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

Проще говоря, что говорит: «Вы можете»Идентификатор не может начинаться с цифры, а идентификатор не может быть просто числом "Значения 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}
...