我正在阅读有关 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.para
和 content.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/