xml - DTD 中的 % 是什么意思?

标签 xml declaration dtd w3c

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

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

这是什么意思?什么样的 XML 可以满足声明?

最佳答案

I am reading the W3C Recommendation on XML. I came across this DTD example:

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

What does this mean? What kind of XML will satisfy the declaration?

您引用的声明中以 % 开头的标记(%name.para;%content.para;)是对参数实体的引用。参数实体在the XML spec的第4节中描述。 ;它们类似于一般实体(使用 & 而不是 % 作为起始分隔符),但一般实体在文档正文中使用,而参数实体在 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 的 Hook ,如此处所示。一些 DTD 允许重命名元素,许多 DTD 提供元素类系统,允许通过覆盖参数实体声明来添加扩展元素,而不是更改每个相关的内容模型。

关于xml - DTD 中的 % 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25498583/

相关文章:

xml - 元素的属性必须存在并且是 dtd 文件中定义的列表之一

xml - 在 XML 中存储列表结构的最有效方式

c++ - 在指针声明中放置星号

Android 应用程序未连接到 Wifi,但在通过 Wifi 共享的 3G 中工作正常

c++ - QImage 构造函数之一给我一个链接器错误,但另一个构造函数没有?

mysql - 在 mysql IF 语句中使用局部变量

firefox-addon - 如何在一个xul中使用多个dtd文件?

Java XML 解析器添加不必要的 xmlns 和 xml :space attributes

xml - 在 Scala 中查找 XML 元素的第一个子元素

xml - Haskell 的哪个 XML 解析器?