DocBook 5中的分块限制了TOC深度并使其跳过数字?

时间:2015-06-01 19:53:18

标签: xml xslt tableofcontents docbook-5 docbook-xsl

我有一个DocBook V5.0文档,它曾经是一个包含整本书的.docbook文件。那时,生成的TOC看起来很好。现在,我已将输入分为4个不同的.docbook文件,并且还需要分块输出。

在这次改变后,我突然遇到两个问题:

  1. TOC 仅包含四个条目(每个.docbook一个条目),而不是它以前的全部深度
  2. 很奇怪,TOC章节编号是 1,2和4,然后是词汇表,它没有数字。
  3. 关于后者,如果我删除第二章,我会得到1,2和词汇表,所以我猜这第二章的内容不会导致错误记录。

    无论如何,我的问题是,如何在保留分块输入和输出的同时恢复正常的TOC? (分块甚至可以限制为单文件深度,即一个文件输入,一个文件输出 - 但我希望TOC深度更高。)

    我做了什么

    我的主文件看起来像这样:

    <!DOCTYPE book [
        <!ENTITY a SYSTEM "a.docbook">
        <!ENTITY b SYSTEM "b.docbook">
        <!ENTITY c SYSTEM "c.docbook">
        <!ENTITY glossary SYSTEM "glossary.docbook">
        <!ENTITY larr "&#x2190;">
        <!ENTITY rarr "&#x2192;">
        <!ENTITY mdash "&#x2014;">
    ]>
    <book xmlns:xl="http://www.w3.org/1999/xlink">
    <title>My Title</title>
    &a;
    &b;
    &c;
    &glossary;
    </book>
    

    我的XSL与之前类似,添加了一些分块控制选项(但没有更改原始TOC选项):

    <?xml version='1.0'?>
    <xsl:stylesheet  
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    
    <xsl:import href="/usr/share/sgml/docbook/xsl-stylesheets/html/chunk.xsl"/>
    
    <xsl:output method="html"
                encoding="UTF-8"
                indent="no"/>
    <!--new--><xsl:param name="chunk.quietly" select="1"></xsl:param>
    <!--new--><xsl:param name="chunker.output.encoding">UTF-8</xsl:param>
    <!--new--><xsl:param name="html.extra.head.links" select="0"></xsl:param>
    <xsl:param name="html.stylesheet" select="'main.css'"/>
    <xsl:param name="generate.toc">
      book      toc,title
    </xsl:param>
    <xsl:param name="glossentry.show.acronym">yes</xsl:param>
    <xsl:param name="glossary.sort" select="1"></xsl:param>
    <!--new--><xsl:param name="use.id.as.filename" select="1"></xsl:param>
    
    </xsl:stylesheet>
    

    我的.docbook个文件都是这样的:

        一个     ...     

    glossary.doc除外:

        词汇表     

    现在,我意识到章节中有一章可能有点奇怪。这甚至可能是原因。但是,它会在没有警告的情况下进行验证,而且,如果我在给定文件<section>中创建最外层标记,则TOC中缺少整个文件。

2 个答案:

答案 0 :(得分:2)

提示:将旧<!ENTITY ...>替换为xinclude。这样做的好处是xml架构可以很好地验证所有内容。此外,XML编辑器可以更好地使用xinclude,然后通过ENTITY包含文件。

以下是一个例子:

档案:book.xml

<?xml version="1.0" encoding="UTF-8"?>

<book version="5.0" xmlns="http://docbook.org/ns/docbook"
      xmlns:xlink="http://www.w3.org/1999/xlink"
      xmlns:xi="http://www.w3.org/2001/XInclude"
      xmlns:db="http://docbook.org/ns/docbook">
  <info>
    <title>This is a book</title>
  </info>

  <chapter>
    <title>This is a chapter</title>

    <section>
      <title>This is a section</title>

      <para>This is a paragraph.</para>
    </section>

    <xi:include href="included_section.xml" />
  </chapter>
</book>

档案:include_section.xml

<?xml version="1.0" encoding="UTF-8"?>

<section version="5.0" xmlns="http://docbook.org/ns/docbook"
         xmlns:xlink="http://www.w3.org/1999/xlink"
         xmlns:xi="http://www.w3.org/2001/XInclude"
         xmlns:ns5="http://www.w3.org/2000/svg"
         xmlns:ns4="http://www.w3.org/1998/Math/MathML"
         xmlns:ns3="http://www.w3.org/1999/xhtml"
         xmlns:db="http://docbook.org/ns/docbook">
  <title>This is an included section</title>
  <para>This is an included paragraph.</para>

  <mediaobject>
    <imageobject>
      <imagedata fileref="media/martin-luther-king.jpg"></imagedata>
    </imageobject>
  </mediaobject>
</section>

在此示例中,还有一个包含文件media的目录martin-luther-king.jpg

上面的示例如下:

<book version="5.0" xmlns="http://docbook.org/ns/docbook"
      xmlns:xlink="http://www.w3.org/1999/xlink"
      xmlns:xi="http://www.w3.org/2001/XInclude"
      xmlns:db="http://docbook.org/ns/docbook">
    <title>My Title</title>
    <xi:include href="chapter-a.xml" />
    <xi:include href="chapter-b.xml" />
    <xi:include href="chapter-c.xml" />
    <xi:include href="glossary.xml" />
</book>

每个单独的文件可能如下所示:

<chapter version="5.0" xmlns="http://docbook.org/ns/docbook"
      xmlns:xlink="http://www.w3.org/1999/xlink"
      xmlns:xi="http://www.w3.org/2001/XInclude"
      xmlns:db="http://docbook.org/ns/docbook">
    <title>This is a chapter</title>

    <section>
      <title>This is a section</title>

      <para>This is a paragraph.</para>
    </section>
</chapter>

词汇表文件可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<glossary version="5.0" xmlns="http://docbook.org/ns/docbook" 
        xmlns:xi="http://www.w3.org/2001/XInclude" 
        xmlns:xlink="http://www.w3.org/1999/xlink">
    <title>Example Glossary</title>

    <para>
        This is not a real glossary, it's just an example.
    </para>
</glossary>

答案 1 :(得分:0)

不要在包含的.docbook文件中嵌套章节。使用chapter作为最外面的标记,section表示其中的所有内容。

(尽管经过验证,我发现最短的文件,我尝试通过将其最外面的标记更改为chapter然后将其内部chapter标记更改为section来重组,实际上有一个缺少一对chapter标签,因此它有一个章节有两个titles等等。在注意到这一点之前,这导致它没有出现在TOC上,所以我假设我已证明section - 内 - chapter由于某种原因无法正常工作,实际上是我的cut-n-paste工作中缺少这些标记。不要依赖验证器!)< / p>