为什么在使用 DTD 验证 XML 文件时会出现"no name for attribute"?



我想设置一个参数实体,以便声明多个元素共有的属性。

我试图做的是使"elem"元素具有属性"宽度CDATA"0"。完成这项工作后,我会在更多元素上使用它。

这是我想出的代码:

<?xml version="1.0"?>
<!DOCTYPE example [
    <!ENTITY % attrs 'width   CDATA   "0"'>
    <!ELEMENT example (elem) >
    <!ELEMENT elem (#PCDATA) >
    <!ATTLIST elem %attrs; > <!-- <This errors with "no name for attribute" -->
]>
<example>
    <elem width="20">Hi how are you</elem>
</example>

我使用的代码基于对类似问题的接受答案(如何声明多个元素共有的属性?但是,当我通过XML验证器(SublimeText上的Exalt或 xmlvalidation.com 运行我的代码时,它会出错。

在上面提到的网站上,错误是:
The attribute name must be specified in the attribute-list declaration for element "elem1".

使用Exalt,错误是:
ATTLIST: no name for Attribute at [...]

我的理解是缺少属性的名称。但是我把属性的名称放在参数实体上,怎么可能检测不到呢?

如果我将 %attrs; 替换为"宽度 CDATA "0",它可以正常工作。

为什么我会收到错误?

这是因为内部子集中的参数实体受到限制。

其中一个限制是参数实体引用不能在标记声明中使用。

从规格:

良好成形约束:内部子集中的 PE

在内部 DTD 子集中,不得出现参数实体引用 在标记声明中;它们可能发生在标记声明 可能发生。(这不适用于外部引用 参数实体或外部子集。

如果将 DTD 放在单独的文件中,则工作正常。(您可能不需要它,但以防万一,请参阅此处以获取在外部文件中引用 DTD 的示例。

相关内容

最新更新