例如,假设一个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文件,那么还有许多其他子元素?
答案 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中的一个功能(有一些条件),您可以在其中提供元素内容的本地定义。