我有许多使用相同主文档类型定义(mrinitialman.dtd)的XML文档。某些元素会根据它们所在的页面进行小的调整:例如,SetPage元素,它是这样定义的:
<!ELEMENT SetPage ((SetImgInf|SetRecInf)?, SetPageName,SetPageDesc?,%credits;)>
<!ELEMENT SetPageName (#PCDATA)>
<!ELEMENT SetPageDesc (#PCDATA)>这个文档类型定义中没有定义SetImgInf和SetRecInf;它们是在需要这些元素的文件的doctype子集中定义的。
例如,recordings.xml对于文档类型声明具有这样的功能:
<!DOCTYPE MainPage SYSTEM "../Site_Data/XML_Etc/mrinitialman.dtd"[
<!ELEMENT SetRecInf EMPTY>
<!ATTLIST SetRecInf recfile CDATA #REQUIRED>
]>我在那里定义SetRecInf,因为它是唯一使用该元素的文件。
但是,有两个文件使用SetImgInf: art_gallery.xml和photo_gallery.xml;它们的doctype如下:
<!DOCTYPE MainPage SYSTEM "../Site_Data/XML_Etc/mrinitialman.dtd" [
<!ELEMENT SetImgInf EMPTY>
<!ATTLIST SetImgInf
imgkeywords CDATA #IMPLIED
imgfile NMTOKEN #REQUIRED
imgformat (jpg|gif|png|tff|bmp) #IMPLIED
thumbformat (jpg|gif|png|tff|bmp) #IMPLIED
>
]>是否有可能将该位放入自己的DTD中,从而使art_gallery.xml和photo_gallery.xml能够有效地引用两个独立的外部文档类型定义?
发布于 2020-09-19 07:24:38
在XML (和SGML)中,可以将任何标记声明放入外部实体,然后引用该外部实体。在你的例子中,你会
<!ELEMENT SetImgInf EMPTY>
<!ATTLIST SetImgInf
imgkeywords CDATA #IMPLIED
imgfile NMTOKEN #REQUIRED
imgformat (jpg|gif|png|tff|bmp) #IMPLIED
thumbformat (jpg|gif|png|tff|bmp) #IMPLIED
>转换为setimginf.dtd (例如),然后更改参数实体声明和后续引用使用该片段的位置:
<!ENTITY % setimginf SYSTEM "setimginf.dtd">
%setimginf;从技术上讲,使用外部子集(如示例中的)
<!DOCTYPE MainPage SYSTEM
"../Site_Data/XML_Etc/mrinitialman.dtd" [
<!ELEMENT SetImgInf EMPTY>
]>等于
<!DOCTYPE MainPage [
<!ELEMENT SetImgInf EMPTY>
<!ENTITY % mrinitialman SYSTEM
"../Site_Data/XML_Etc/mrinitialman.dtd">
%mrinitialman;
]>https://stackoverflow.com/questions/63953436
复制相似问题