DTD 解析:参数实体引用名称包括另一个参数实体引用 - 格式正确吗?

发布于 2024-12-17 21:45:30 字数 678 浏览 4 评论 0原文

我正在编写一个 DTD 解析器,但我有点不确定如何扩展参数实体。例如,此 DTD 摘录有效吗?

<!ENTITY % xx '&#37;zz;'>
<!ENTITY % zz '&#60;!ENTITY tricky "error-prone" >' >
<!ENTITY % abcd '%xx;'>
<!ENTITY % ef 'c'>
<!ENTITY % gh '%ab%ef;d;'>
%gh;

更具体地说,我很好奇实体 gh 是否会正确扩展。我认为%ef;应首先扩展为“c”,然后扩展为新形成的 PE 引用 %abcd;应扩展为 %xx;等等。

我见过的大多数解析器都将 %ab 识别为 PE 引用,并且由于未定义 PE 而失败。但我在标准中发现绝对没有任何参考要求解析器以这种方式工作。我发现的唯一参考是 Induced in Literal 而不是 作为 PE 包含,其中声明替换文本必须以一位前导和一位放大在 0x20 之后 - 但不在字面意思。

有什么指点吗? 谢谢。

I'm writing a DTD parser and I'm a little uncertain how to expand parameter entities. For example is this DTD excerpt valid?

<!ENTITY % xx '%zz;'>
<!ENTITY % zz '<!ENTITY tricky "error-prone" >' >
<!ENTITY % abcd '%xx;'>
<!ENTITY % ef 'c'>
<!ENTITY % gh '%ab%ef;d;'>
%gh;

More specifically I'm curious to know if entity gh will expand correctly. In my opinion %ef; should expand first to 'c' and then the newly formed PE reference %abcd; should expand to %xx; and so on.

Most of the parsers I've seen are identifying %ab as a PE reference and fail since that PE is not defined. But I found absolutely no reference in the standard asking for the parser to work this way. The only reference I found was Included in Literal as opposed to Included as PE where it states that the replacement text must be enlarged with one leading and one following 0x20 - but not in a literal.

Any pointers?
Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

难以启齿的温柔 2024-12-24 21:45:31

该问题示例代码的第一行取自此示例 在 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... 被视为对参数实体名称。

The first rows of the example code of this question are taken from this example in the W3C XML recommendation, so those who are not familiar with the quite convoluted logic of the DTD escapes should see the explanation that is written there.

More specifically I'm curious to know if entity gh will expand
correctly.

No, it won't. Reason for this is that your definition for parameter entity gh has malformed syntax. Syntax for parameter entity definitions is: (ref)

PEDecl   ::=    '<!ENTITY' S '%' S Name S PEDef S? '>'
PEDef    ::=    EntityValue | ExternalID

and syntax for entity values is: (ref)

EntityValue   ::=       '"' ([^%&"] | PEReference | Reference)* '"'
                        |  "'" ([^%&'] | PEReference | Reference)* "'"

"PEReference" is a parameter entity reference (%Name;) and "Reference" is either a general entity reference (&Name;)or a character reference ({ or {). (ref)

Here [^%&"] and [^%&'] mean that the entity value cannot contain a % character unless it denotes the start of a (parameter entity) name production. And because % is not a valid name character, but it appears before the name production end character ;, the character sequence %ab% will cause an error. I'd say it should work if the first % sign is replaced with a character reference so then the %ef; entity replacement is done before the %ab... is seen as a reference to a parameter entity name.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文