在 XML 中定义全局属性

Defining global attributes in XML

我认为这是一个简单的问题,但搜索后找不到任何解决方案。有什么方法可以在 XML DTD 中定义全局属性以供所有元素访问?

如果您要问,能否有一个适用于多个元素的 ATTLIST,答案是否定的。 The attribute list declaration must only have a single name. 对于每个具有属性的元素,您都无法绕过 ATTLIST

但是,您可以使用 parameter entity 在多个属性列表声明中重用属性定义。这将使维护公共属性变得更加容易。

举个例子。在示例中有两个属性,attr1attr2,它们是元素 elem1elem2 共有的。这些元素还具有属性,分别为 unique-attr1unique-attr2,这些属性是这些元素所独有的。

so.dtd

<!ENTITY % common-attrs
    "common1 CDATA #REQUIRED
     common2 CDATA #REQUIRED">

<!ELEMENT test (elem1,elem2)>

<!ELEMENT elem1 EMPTY>
<!ATTLIST elem1
    %common-attrs;
    unique1 CDATA #REQUIRED>

<!ELEMENT elem2 EMPTY>
<!ATTLIST elem2 
    %common-attrs;
    unique2 CDATA #REQUIRED>

下面是 XML 实例的示例:

so.xml

<!DOCTYPE test SYSTEM "so.dtd">
<test>
    <elem1 common1="x" common2="x" unique1="x"/>
    <elem2 common1="x" common2="x" unique2="x"/>
</test>

注意:在标记声明中使用参数实体引用,就像我在上面所做的那样,只允许在外部子集(外部 DTD)中使用;不在内部子集(内部 DTD)中。 (内部和外部子集都在下面引用的规范的同一部分中讨论。)

来自spec

Well-formedness constraint: PEs in Internal Subset

In the internal DTD subset, parameter-entity references must not occur within markup declarations; they may occur where markup declarations can occur. (This does not apply to references that occur in external parameter entities or to the external subset.)

您可以使用 XML 设计模式:公共属性

http://www.xmlpatterns.com/CommonAttributesMain.shtml