【问题标题】:Why do I get "no name for attribute" when I validate my XML file with DTD?当我使用 DTD 验证我的 XML 文件时,为什么会出现“没有属性名称”?
【发布时间】:2019-04-05 23:49:42
【问题描述】:

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

我要做的是让“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 上的 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;使用'width CDATA“0”',它工作正常。

为什么会出现错误?

【问题讨论】:

  • 好问题。 +1 此外,如果另一个问题中接受的答案有帮助,则表示赞赏。 ;-)
  • 我慢慢意识到要得到好的答案,你需要努力提出好的问题。将相应地展开投票,并再次感谢您的帮助。

标签: xml dtd


【解决方案1】:

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

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

From the spec:

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

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

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

【讨论】:

  • 刚刚意识到问题将 XML 版本声明为 1.0,但我的规范链接是 1.1。 1.0也是一样;这是参考链接:w3.org/TR/REC-xml/#dtd
  • 谢谢。将 DTD 内容放在外部文件中解决了问题。
猜你喜欢
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 2015-10-28
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多