在XML DTD中,是否可以为同一个元素提供多个定义,具体取决于它是否为文档根目录?

时间:2015-03-09 13:04:58

标签: xml xsd xml-parsing dtd

例如,假设一个XML文件book_list.xml是包含0个或更多书籍的书籍的列表视图,每个书籍只有3个子元素ID,标题和作者。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE bookList SYSTEM "books.dtd">
<bookList>
    <book>
        <id>123</id>
        <title>One Book Title</title>
        <author>......</author>
    </book>

    <book>
        <id>456</id>
        <title>Another Book Title</title>
        <author>......</author>
    </book>
</bookList>

另一个XML文件book.xml是一本书的详细视图,其中包含许多其他必需属性,例如publisher,year,isbn。此文档的根元素是book

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book SYSTEM "books.dtd">
<book>
    <id>123</id>
    <title>One Book Title</title>
    <author>.....</author>
    <isbn>......</isbn>
    <year>......</year>
    <publisher>......</publisher>
</book>

我的问题是我们是否可以在单个DTD中为book元素提供重载定义,其中book元素只有3个子元素,当它是bookList的子元素但是“必需”时如果book本身是文档根目录还是我们必须创建单独的DTD文件,那么还有许多其他子元素?

2 个答案:

答案 0 :(得分:4)

我认为使用DTD最接近这种功能的方法是使用INCLUDE and IGNORE sections

您可以创建参数实体来保存INCLUDE / IGNORE值。可以将DTD设置为默认为book声明之一。

要切换到另一个book声明,您需要在DOCTYPE声明的内部子集中重新定义参数实体。

示例(使用Xerces在oXygen中验证)

<强> books.dtd

<!ENTITY % bigbook   "IGNORE">
<!ENTITY % smallbook "INCLUDE">

<!ELEMENT bookList (book)+>

<![%smallbook;[
<!ELEMENT book (id,title,author)>
]]>

<![%bigbook;[
<!ELEMENT book (id,title,author,isbn,year,publisher)>
]]>

<!ELEMENT id (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT isbn (#PCDATA)>
<!ELEMENT year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>

<强> book_list.xml

<!DOCTYPE bookList SYSTEM "books.dtd">
<bookList>
    <book>
        <id>123</id>
        <title>One Book Title</title>
        <author>......</author>
    </book>    
    <book>
        <id>456</id>
        <title>Another Book Title</title>
        <author>......</author>
    </book>
</bookList>

<强>是book.xml

<!DOCTYPE book SYSTEM "books.dtd" [
<!ENTITY % bigbook   "INCLUDE">
<!ENTITY % smallbook "IGNORE">
]>
<book>
    <id>123</id>
    <title>One Book Title</title>
    <author>.....</author>
    <isbn>......</isbn>
    <year>......</year>
    <publisher>......</publisher>
</book>

答案 1 :(得分:0)

不,这是不可能的。

当在DTD中定义元素时,无论您使用此元素的上下文如何,其定义都是相同的,唯一的可能性是提供带有可选标记的book元素的整体定义或属性。

但是,它是XML Schema中的一个功能(有一些条件),您可以在其中提供元素内容的本地定义。