【问题标题】:Chunking in DocBook 5 limits TOC depth and makes it skip numbers?DocBook 5 中的分块限制了 TOC 深度并使其跳过数字?
【发布时间】:2015-08-15 10:03:26
【问题描述】:

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

这个改动之后我突然有两个问题:

  1. TOC 仅包含四个条目(每个 .docbook 一个条目),而不是以前的全部深度
  2. 很奇怪,TOC 章节编号是1、2 和 4,然后是词汇表,它没有编号。

关于后者,如果我删除第二章,我会得到 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 除外:

词汇表

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

【问题讨论】:

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


    【解决方案1】:

    提示:将旧的 &lt;!ENTITY ...&gt; 替换为 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>
    

    【讨论】:

    • 感谢您的提示,但使用 DocBook V5.0 的好处之一不是您可以将文件命名为 .docbook 并省略 &lt;?xml... 和 docbook 命名空间吗?无论如何,您的语法确实有效,但结果是相同的(TOC 编号 1、2 和 4,然后是词汇表;并且 TOC 也没有超出该深度。)尽管如此 +1,因为我通过这种方式学到了一些东西,并且感谢您的周到。
    • 好吧,谢谢你的解释,我不知道是否有 DocBook 扩展。关于这个问题,几乎听起来内容或改进的 XSL 存在一些问题。你能分享一个这些内容文件的小例子吗?也许是 GitHub Gist help.github.com/articles/about-gists
    • 谢谢,查看内容文件是解决问题的关键。答案如下。
    【解决方案2】:

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

    (尽管进行了验证,但我发现最短的文件,我试图通过将其最外层标记更改为 chapter,然后将其内部 chapter 标记更改为 section,实际上缺少一对 chapter标签,所以它有一章有两个titles等等。在注意到这一点之前,这导致它没有出现在TOC上,所以我假设我已经证明了section-within-@ 987654330@ 出于某种原因不起作用,实际上是我的剪切粘贴工作中缺少这些标签。不要依赖验证器!)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 2013-04-25
      • 1970-01-01
      相关资源
      最近更新 更多