【发布时间】:2015-01-30 05:52:09
【问题描述】:
我想知道是否有扩展 DTD 的标准方法,或者验证文档的唯一方法是否是在 XML 文件中添加所有必要的扩展。
我有一个插件系统,它们通常像 Linux 安装中的包一样组织(即插件可以依赖于一个或多个插件,不允许循环):
+----------------------+
+-->| Editor |<--+
| +----------------------+ |
| |
+-----------------+ +-----------------+
| Locale | | Image |
+-----------------+ +-----------------+
^ ^
| |
| +----------------------+ |
+---| GeoMap |---+
+----------------------+
所以,我有一个编辑器插件中的 DTD,例如,一个小部件标签,它有一个名为 auto-save 的属性,如下所示:
<!ELEMENT widget (value|preset|default|state)*>
<!ATTLIST widget id ID #REQUIRED
type NMTOKEN #REQUIRED
auto-save (double | html | int8
| date-us | no | string) "string">
事实是,当我添加区域设置时,我现在希望自动保存属性也支持诸如 locale-date 之类的类型,该类型并非特定于美国。
同样,Image 插件可能想要添加 image 类型,而 GeoMap 插件可以使用 geo-location。
所以最后,ATTLIST 自动保存应该是这样的(显然,顺序无关紧要):
auto-save (double | html | int8 | date-us | no
| string | locale-date | image | geo-location) "string"
即使在 XML 文件中定义多个 DTD(根标记中的xmlns=... 属性),我认为您也做不到,对吗?
现在我可以在 editor.dtd 中添加类型,但是当这些插件在您的图表中可能不可用时,定义语言环境、图像和地理地图类型显然是错误的......
我能想到的另一种解决方案是使用 XSD,但即使使用这种格式,我该如何添加属性和标签的子添加?
【问题讨论】:
-
不确定我是否理解这个问题。除其他复杂情况外,您显示的图表似乎不是一棵树。
-
Hmmm... Debian/Ubuntu 中的软件包被定义为在树中,对吧?包 A 可以依赖一个或多个包,比如 B、C 和 D。但是 B 也可能依赖于 D。但是,B、C 和 D 不能依赖 A。这不就是树的定义吗?
-
不,像软件包依赖这样的 n:m 关系会产生一个有向图,在一般情况下它不是树。树需要 1:n 关系,因此除根之外的每个节点都只有一个父节点。您提到的约束排除了依赖循环,并为您提供了无环有向图,而不是树。
-
好的,是的。就是那个。我相信你已经注意到了,我更新了我的问题。 en.wikipedia.org/wiki/Directed_acyclic_graph
标签: xml xml-validation dtd