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

问题描述 投票:1回答:1

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

我要做的是让“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验证器运行我的代码时(Exalt on 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; 'width CDATA“0”',它工作正常。

为什么我收到错误?

xml dtd xml-dtd
1个回答
1
投票

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

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

From the spec

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.