草庐IT

xml - DTD 解析 : Parameter entity reference name including another parameter entity reference - is it well formed?

coder 2024-07-01 原文

我正在编写一个 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 未定义。但是我在要求解析器以这种方式工作的标准中绝对没有发现任何引用。我找到的唯一引用是 Included in Literal而不是 Included as PE其中声明替换文本必须用一个前导和一个后跟 0x20 来放大 - 但不是文字。

有什么指点吗? 谢谢。

最佳答案

本题示例代码第一行摘自this example在 W3C XML 推荐中,所以那些不熟悉 DTD 转义相当复杂的逻辑的人应该看到那里写的解释。

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

不,不会。原因是您对参数实体 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... 被视为对参数实体名称的引用之前完成。

关于xml - DTD 解析 : Parameter entity reference name including another parameter entity reference - is it well formed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8253210/

有关xml - DTD 解析 : Parameter entity reference name including another parameter entity reference - is it well formed?的更多相关文章

随机推荐