Использование специальных символов, таких как «+» в объекте DTD - PullRequest
3 голосов
/ 02 января 2012

Я пытаюсь определить сущность, значение которой содержит символ «+», но если я это сделаю, я получу странное сообщение об ошибке в дальнейшем.Если я удаляю символ +, все работает нормально.Кажется, я не могу найти способ избежать этого.Я получаю сообщение об ошибке не только с той библиотекой, которой я сейчас пользуюсь, но и с онлайн-валидатором по номеру http://www.validome.org/grammar/validate/. Короткий пример:

<?xml version="1.0" encoding="UTF-8"?>

<!ENTITY % Foo "BAR"> <!--No problem here-->
<!ENTITY % Baz "QUUX+QUUUX"> <!--This will cause trouble later on-->

<!ENTITY % FooBazType "( %Foo; | %Baz; )">

<!ELEMENT tagName EMPTY>
<!ATTLIST tagName attributeName %FooBazType; #REQUIRED> <!--Here, you get the error message : The enumerated type list must end with ')' in the "attributeName" attribute declaration.-->

Кто-нибудь знает способ получить+ символ (или что-то, что также правильно проверит документ XML, который будет содержать символ + в этом месте) каким-то образом?Заранее спасибо!

1 Ответ

1 голос
/ 04 января 2012

Проблема не в самой сущности, а в том, что она используется для определения атрибута, в котором перечислены допустимые значения .Такие значения должны соответствовать Nmtoken (одному или нескольким NameChar с).Это исключает «+» и «$», которые не являются частью определения NameChar.Пример ниже иллюстрирует это.

plus.dtd:

<!ELEMENT tagName EMPTY>
<!ATTLIST tagName 
          attributeName (BAR | FOO+BAZ) #REQUIRED>

plus.xml:

<tagName attributeName="FOO+BAZ"/>    

xmllint выводится при попытке проверить plus.xml против plus.dtd:

xmllint --dtdvalid plus.dtd plus.xml 
<?xml version="1.0"?>
<tagName attributeName="FOO+BAZ"/>
plus.dtd:2: parser error : ')' required to finish ATTLIST enumeration
<!ATTLIST tagName attributeName (BAR | FOO+BAZ) #REQUIRED>
                                          ^
plus.dtd:2: parser error : Space required after the attribute type
<!ATTLIST tagName attributeName (BAR | FOO+BAZ) #REQUIRED>
                                          ^
plus.dtd:2: parser error : Content error in the external subset
<!ATTLIST tagName attributeName (BAR | FOO+BAZ) #REQUIRED>
                                          ^
Could not parse DTD plus.dtd

Допустимо использование «+» или «$» в фиксированном значении атрибута.

plus2.dtd:

<!ELEMENT tagName EMPTY>
<!ATTLIST tagName 
          attributeName CDATA #FIXED "FOO+$BAZ">

xmllint output (без ошибки):

xmllint --dtdvalid plus2.dtd plus.xml 
<?xml version="1.0"?>
<tagName attributeName="FOO+$BAZ"/>
...