3

我正在处理一个相当大的 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>
        &section1;
        &section2;
        &section3;
    </chapter>
</book>

第 3 节又分为三个 xml 文件,其内容通过引用包含在内,如下所示:

section3.xml

<?xml version="1.0" encoding="UTF-8"?>
<section id="Section3">
    <title>Section 3</title>
    &section3_a;
    &section3_b;
    &section3_c;
</section>

问题:有没有办法将仅由第 3 节(即 section3_a、section3_b 等)使用的实体声明移动到section3.xml而不是在 中声明它们main.book.xml

4

1 回答 1

4

是的,这是可能的,只需将它们添加到文档中,您正在使用它们。但我强烈反对使用实体,包括其他文件(部分)!迟早你会遇到困难,即一个(或多个)文档(部分)不可用。您的文档将不会呈现并搜索导致它的问题是相当讨厌的。一个更好的解决方案是使用 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>
        &section1;
        &section2;
        &section3;
    </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>
    &section3_a;
    &section3_b;
    &section3_c;
</section>

提示:您甚至可以将实体一起从文档中移出,请参阅我在DocBook 宏这个问题上写的答案?

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="&section-changes;">
        <xi:fallback><para>FIXME File not found: "&section-changes;"</para></xi:fallback>
    </xi:include>

</chapter>

这里xi:include使用了一个后备,所以如果无法解决该href属性,则将后备呈现到文档中(这将显示一个带有 FIXME 的段落。这里实际上使用了一个实体,用于引用文档(位置) xi:include. 这很好,因为该参考可以在href和 FIXME 部分中使用!

小心引用实体文件../entities.ent当它无法解决时,这又会产生令人讨厌的错误。

于 2010-06-04T20:49:46.150 回答