我想知道是否有扩展DTD的标准方法,或者验证文档的唯一方法是在XML文件中添加所有必要的扩展名。
我有一个插件系统,通常像 Linux 安装中的包一样组织(即插件可以依赖于一个或多个插件,不允许循环(:
+----------------------+
+-->| Editor |<--+
| +----------------------+ |
| |
+-----------------+ +-----------------+
| Locale | | Image |
+-----------------+ +-----------------+
^ ^
| |
| +----------------------+ |
+---| GeoMap |---+
+----------------------+
因此,我拥有的是编辑器插件中的DTD,例如,带有一个名为自动保存的属性的小部件标签,如下所示:
<!ELEMENT widget (value|preset|default|state)*>
<!ATTLIST widget id ID #REQUIRED
type NMTOKEN #REQUIRED
auto-save (double | html | int8
| date-us | no | string) "string">
事实是,当我添加区域设置时,我现在希望自动保存属性也支持非特定于美国的区域设置日期等类型。
同样,图像插件可能需要添加图像类型,而地理地图插件可以使用地理位置。
所以最后,ATTLIST 自动保存应该看起来像这样(显然,顺序无关紧要(:
auto-save (double | html | int8 | date-us | no
| string | locale-date | image | geo-location) "string"
即使在XML文件中定义多个DTD(根标记中的xmlns=...
属性(,我认为您也不能这样做,不是吗?
现在我可以在编辑器中添加类型.dtd,但是当这些插件在您的图表中可能不可用时,定义区域设置、图像和地理地图类型显然是错误的......
我能想到的另一个解决方案是使用 XSD,但即使使用这种格式,我该如何添加属性和标签的子添加?
DTD 是不可扩展的。但与此同时,可以使用可扩展的 XML 架构。
我认为你不能创建一个DtD作为另一个的扩展。
最好的替代方法可能是参数实体,在 XML 中导入 DtD 时,它可用于扩展 DtD。W3C有一些用于DtD调制的一般示例。
在您的情况下,小部件声明可以更改为 [widget.dtd]:
<!ELEMENT widget (value|preset|default|state)*>
<!ENTITY % AUTO-SAVE-ENUMS-EXTRA ""> <!-- additional auto-save values -->
<!ATTLIST widget id ID #REQUIRED
type NMTOKEN #REQUIRED
auto-save (double | html | int8
| date-us | no | string %AUTO-SAVE-ENUMS-EXTRA;) "string" >
这引入了默认值为 "(空字符串(的 %AUTO-SAVE-ENUMS-EXTRA;
参数实体。可以覆盖它以在导入 DtD 时扩展枚举列表:
<!DOCTYPE widget SYSTEM "widget.dtd" [
<!ENTITY % AUTO-SAVE-ENUMS-EXTRA "| locale-date | image | geo-location">
]>
<widget id="foo" type="test" auto-save="geo-location"/>
关于如何更普遍地编辑 DtD 中的属性和实体,添加属性和实体很简单。但是,将新实体插入现有文档树通常涉及参数实体。
考虑Document.dtd
:
<!ENTITY % Document-Elements-Extra "">
<!ELEMENT Document (P|H1|H2 %Document-Elements-Extra;)*>
<!ELEMENT P (#PCDATA)>
<!ELEMENT H1 (#PCDATA)>
<!ELEMENT H2 (#PCDATA)>
以下 XML 文件导入 DtD,添加H3
元素,并向P
元素添加 type
属性:
<!DOCTYPE Document SYSTEM "Document.dtd" [
<!ATTLIST P type CDATA #IMPLIED>
<!ELEMENT H3 (#PCDATA)>
<!ENTITY % Document-Elements-Extra "|H3">
]>
<Document>
<H1>Level 1 Header</H1>
<P type="test">This is a test of DtD parameter entities</P>
<H3>Level 3 Header</H3>
</Document>