Проблема не в самой сущности, а в том, что она используется для определения атрибута, в котором перечислены допустимые значения .Такие значения должны соответствовать 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"/>