当我使用DTD验证XML文件时,为什么会得到“属性没有名称”的信息?

时间:2019-04-05 13:41:57

标签: xml dtd xml-dtd

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

我想做的是使“ elem”元素的属性为“ width 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>

我使用的代码基于对类似问题(How do I declare attributes common to multiple elements?)的公认答案。但是,当我通过XML验证器运行代码时(对SublimeText或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”“,它工作正常。

为什么会出现错误?

1 个答案:

答案 0 :(得分:1)

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

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

From the spec

  

格式约束:内部子集中的PE

     

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

如果将DTD放在单独的文件中,则可以正常工作。 (您可能不需要它,但以防万一,see here是在外部文件中引用DTD的示例。)