Первые строки примера кода этого вопроса взяты из этого примера в рекомендации W3C XML, поэтому те, кто не знаком с довольно запутанной логикой побегов DTD, должны увидеть объяснение, чтотам написано.
Точнее, мне любопытно узнать, будет ли сущность gh расширяться правильно.
Нет, не будет.Причиной этого является то, что ваше определение для параметра сущности gh
имеет неправильный синтаксис.Синтаксис для определения сущности параметра: ( ref )
PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>'
PEDef ::= EntityValue | ExternalID
, а синтаксис для значений сущности: ( ref )
EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"'
| "'" ([^%&'] | PEReference | Reference)* "'"
«PEReference» - это ссылка на объект параметра (%Name;
), а «Reference» - это либо ссылка на общий объект (&Name;
), либо ссылка на символ ({
или {
).( ref )
Здесь [^%&"]
и [^%&']
означают, что значение объекта не может содержать символ %
, если оно не обозначает начало производства имени (объекта-параметра).А поскольку %
не является допустимым символом имени, но появляется перед символом окончания производства имени ;
, последовательность символов %ab%
вызовет ошибку.Я бы сказал, что это должно сработать, если первый знак %
будет заменен ссылкой на символ, поэтому замена сущности %ef;
выполняется до того, как %ab...
будет рассматриваться как ссылка на имя сущности параметра.