我正在研究一个相当大的DocBook XML文档。主要内容包含章节,但包括使用实体引用的所有小节。像这样:
main.book.xml
:
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"
[
<!ENTITY section1 SYSTEM "../fragments/section1.xml">
<!ENTITY section2 SYSTEM "../fragments/section2.xml">
<!ENTITY section3 SYSTEM "../fragments/section3.xml">
<!ENTITY section3_a SYSTEM "../fragments/section3_a.xml">
<!ENTITY section3_b SYSTEM "../fragments/section3_b.xml">
<!ENTITY section3_c SYSTEM "../fragments/section3_c.xml">
]>
<book>
<chapter>
<title>Chapter 1</title>
§ion1;
§ion2;
§ion3;
</chapter>
</book>
第3节又分为三个xml文件,其内容通过引用包含在内,如下所示:
section3.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<section id="Section3">
<title>Section 3</title>
§ion3_a;
§ion3_b;
§ion3_c;
</section>
问题:有没有办法将仅由第3节(即section3_a,section3_b等)使用的ENTITY声明移至section3.xml
,而不是在main.book.xml
中声明它们?
答案 0 :(得分:3)
是的,这是可能的,只需将它们添加到文档中,即可使用它们。 但我强烈反对使用实体,包括其他文件(部分)!您很快就会遇到困难,文件(部件)中的一个(或多个)不可用。您的文档不会呈现并搜索问题,因为它非常令人讨厌。一个更好的解决方案是使用XInclude来包含文档。
使用ENTITY条目的解决方案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"
[
<!ENTITY section1 SYSTEM "../fragments/section1.xml">
<!ENTITY section2 SYSTEM "../fragments/section2.xml">
<!ENTITY section3 SYSTEM "../fragments/section3.xml">
]>
<book>
<chapter>
<title>Chapter 1</title>
§ion1;
§ion2;
§ion3;
</chapter>
</book>
另一个文档文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"
[
<!ENTITY section3_a SYSTEM "../fragments/section3_a.xml">
<!ENTITY section3_b SYSTEM "../fragments/section3_b.xml">
<!ENTITY section3_c SYSTEM "../fragments/section3_c.xml">
]>
<section id="Section3">
<title>Section 3</title>
§ion3_a;
§ion3_b;
§ion3_c;
</section>
提示:您甚至可以将所有实体从文档中移出,请参阅我在此问题上撰写的答案DocBook macros?
XInclude解决方案
然后是一个如何使用XInclude设置文档的示例。实体条目用于小字符串。并使用XInclude来包含文件。
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
<!ENTITY maven.project.version "(not set)">
<!ENTITY % entities SYSTEM "entities.ent" >
%entities;
]>
<book>
<title>&product.name;</title>
<subtitle>Release Notes</subtitle>
<bookinfo>
<date>&product.release.date;</date>
<releaseinfo><?eval ${project.version}?></releaseinfo>
</bookinfo>
<!-- Include chapters -->
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="changes/chapter-release-2.0.xml" />
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="changes/chapter-release-2.1.xml" />
</book>
章节文件(放在目录changes
中),前一个文档包含该文件。如果上面使用了xi:include
,如果href
属性无法解决,它将停止渲染。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"[
<!ENTITY section-changes "section-changes-v2.0.xml">
<!ENTITY % entities SYSTEM "../entities.ent">
%entities;
]>
<chapter id="release-2.0">
<title>Release 2.0</title>
<para>
Information given in this chapter applies for <emphasis>&product.name; v2.0</emphasis>.
</para>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="§ion-changes;">
<xi:fallback><para>FIXME File not found: "§ion-changes;"</para></xi:fallback>
</xi:include>
</chapter>
此处xi:include
与回退一起使用,因此如果无法解决href
的{{1}}属性,则会将回退呈现到文档中(这将显示一个段落其中使用FIXME。这里实际上是一个实体,用于引用文档(位置)。这很好,因为该引用可以在xi:include
和FIXME部分中使用!
小心引用回实体文件href
当无法解决时,这会再次产生令人讨厌的错误。