我正在阅读有关XML的W3C建议书。我遇到了这个DTD示例:
<!ELEMENT %name.para; %content.para; >
这是什么意思?什么样的XML将满足声明?
答案 0 :(得分:4)
我正在阅读有关XML的W3C建议书。我遇到了这个DTD示例:
<!ELEMENT %name.para; %content.para; >
这是什么意思?什么样的XML将满足声明?
在引用的声明(%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的钩子,如此处所示。一些DTD允许重命名元素,许多提供元素类系统,允许通过覆盖参数实体声明而不是更改每个相关内容模型来添加扩展元素。