【问题标题】:Internal Subset DTD referencing External DTD内部子集 DTD 引用外部 DTD
【发布时间】:2021-01-05 06:08:51
【问题描述】:

我有许多使用相同主文档类型定义 (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,因为它是 only 使用该元素的文件。

但是,有两个文件使用 SetImgInf:art_gallery.xml 和 photo_gallery.xml;他们的文档类型是这样的:

<!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 有效地引用两个单独的外部文档类型定义?

【问题讨论】:

    标签: xml dtd


    【解决方案1】:

    在 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;
    ]>
    

    【讨论】:

    • 我试过你的建议,但似乎没有用。难道是因为我是通过 PHP 处理我的 XML,而 PHP 本身不配合?
    猜你喜欢
    • 2018-09-24
    • 2011-07-24
    • 2011-09-09
    • 1970-01-01
    • 2018-06-17
    • 2016-04-01
    • 1970-01-01
    相关资源
    最近更新 更多