【问题标题】:Why is this not a valid XML DTD? (Parameter entity and #PCDATA)为什么这不是一个有效的 XML DTD? (参数实体和#PCDATA)
【发布时间】:2011-02-17 16:33:52
【问题描述】:

使用 DTD 验证器here,我被告知以下 DTD 无效。

<!ENTITY % text "(#PCDATA|L)*">
<!ELEMENT H         (%text;)+>
<!ELEMENT L         (#PCDATA)>

错误消息是:“在元素类型“H”的声明中需要一个 '(' 字符或元素类型。”在第 2 行第 22 列。

谁能指出它为什么无效?我怎样才能使它有效?错误消息对我来说并不是很友好。谢谢。

【问题讨论】:

  • 我可能会误认为这是错误,但在解析 %text; 之后,您嵌套了两个括号。
  • 嗯,在 XML DTD 中嵌套两个括号是无效的吗?不确定。但如果我从%text; 实体声明中删除#PCDATA,使其变为&lt;!ENTITY % text "(L)*"&gt;,则DTD 变为有效。

标签: xml dtd xml-validation pcdata


【解决方案1】:

您不能强制要求具有混合内容的元素必须至少有一个子节点。你的 DTD 变成了

<!ELEMENT H         ((#PCDATA|L)*)+>

实体展开时。具有混合内容的元素唯一允许的形式是

(#PCDATA | A | B | C)*

其中 A、B 和 C 是可能的子元素。 #PCDATA 必须是首选,并且必须允许该集合重复 0-infinity 次,即需要星号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2014-08-01
    • 2011-10-12
    • 2020-08-21
    相关资源
    最近更新 更多