我有一个DocBook V5.0文档,它曾经是一个包含整本书的.docbook
文件。在这一点上,生成的TOC看起来很好。现在,我已经将输入分块到4个不同的.docbook
文件中,并且还需要分块输出。
修改后,我突然有两个问题:
- TOC 只包含四个条目(每个。docbook一个)而不是它用于 的完整深度。很奇怪,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 "←">
<!ENTITY rarr "→">
<!ENTITY mdash "—">
]>
<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中将丢失整个文件。
提示:用xinclude替换旧的<!ENTITY ...>
。这样做的好处是可以很好地通过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
文件中嵌套章节。chapter
用于最外层的标签,section
用于内部的所有内容。
(尽管经过验证,我发现最短的文件,我试图通过将其最外层的标签更改为chapter
,然后将其内部的chapter
标签更改为section
来重组,实际上缺少一对chapter
标签,因此它具有两个titles
等的章节。)在注意到这一点之前,这导致它没有出现在TOC上,所以我假设我已经证明了section
-within- chapter
由于某种原因不起作用,而实际上是我的剪切-粘贴工作中缺少的这些标签。不要依赖于验证器!)