【问题标题】:What does % mean in DTD?DTD 中的 % 是什么意思?
【发布时间】:2014-10-19 08:26:21
【问题描述】:

我正在阅读 W3C 关于 XML 的建议书。我遇到了这个 DTD 示例:

<!ELEMENT %name.para; %content.para; >

这是什么意思?什么样的 XML 才能满足声明?

【问题讨论】:

标签: xml declaration dtd w3c


【解决方案1】:

我正在阅读 W3C 关于 XML 的建议书。我遇到了这个 DTD 示例:

    <!ELEMENT %name.para; %content.para; >

这是什么意思?什么样的 XML 才能满足声明?

您引用的声明(%name.para;%content.para;)中以 % 开头的标记是对参数实体的引用。参数实体在the XML spec的第4节中描述;它们类似于一般实体(使用&amp; 而不是% 作为它们的开始分隔符),但一般实体用于文档正文,而参数实体用于DTD。

为了在上下文中正确,此声明要求在 DTD 的较早部分已经声明了参数实体 name.paracontent.para。满足声明的 XML 类型取决于这些实体的声明方式。

相关声明可能如下,例如:

<!ENTITY % name.para "p">
<!ENTITY % content.para "(#PCDATA | emph | name | date)*">

在这种情况下,您引用的声明将与以下声明具有相同的效果(我通过将参数实体引用替换为相关参数实体的替换文本得到):

<!ELEMENT p (#PCDATA | emph | name | date)* >

参数实体提供的间接性允许轻松自定义词汇表。 DTD 的调用者可以用替代声明覆盖两个参数实体的声明,以将元素的名称从 p 更改为 para 并将 partnum 元素添加到内容模型,如下所示:

<!ENTITY % content.para "(#PCDATA | emph | name | date
   | partnum)*">
<!ENTITY % name.para "para">

现在元素声明的效果是声明了一个名为para的元素:

<!ELEMENT para (#PCDATA | emph | name | date | partnum)* >

(为了清楚起见,我在这里对空格进行了标准化。)

以下 XML 对第一组声明有效,但对第二组无效:

<p>Hello, world!</p>

以下内容对第二个有效,但对第一个无效:

<para>You will need the replacement vacillator (part number
  <partnum>Q34-5332</partnum>) and a screwdriver.</para>

参数实体的一个常见用途是为自定义 DTD 提供挂钩,如下所示。一些 DTD 允许重命名元素,许多 DTD 提供了一个元素类系统,允许通过覆盖参数实体声明而不是更改每个相关的内容模型来添加扩展元素。

【讨论】:

  • 我想我理解你。但是,当我尝试使用 validator.w3.org/check 中的参数实体创建示例时,我收到一条错误消息,提示“在内部子集中的参数分隔符中引用参数实体”。你知道出了什么问题吗?
  • 为了简化非验证解析器的工作,XML 规范试图使解析出现在主要 XML 文档(DTD 的“内部子集”)中的 DTD 部分成为可能完全了解 DTD 语法;除其他外,它禁止内部子集中的参数实体引用。如果你想使用参数实体,你必须创建一个外部 DTD 并在那里使用参数实体。
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2011-08-12
  • 2017-06-11
  • 2018-03-05
  • 2023-03-27
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多