2011-09-02 127 views
1

我有以下文档结构,我想生成一个适合我的XSLT转换的目录。我尝试了很多东西,但都没有为我工作。有人能帮助我吗?XSL-FO - 如何生成目录?

随着下面的转换,我得到这个警告和空的页码在这个地方。

WARNING: Page 2: Unresolved id reference "N65898" found. 

Document structure

<article> 
    <chapter> 
     <title>Chapter 1</title> 
     <para>chapter 1 text</para> 
     <sect1> 
      <title>Section1 1.1</title> 
      <para>text 1.1</para> 
      <sect2> 
       <title>Section2 1.1.1</title> 
       <para>text 1.1.1</para> 
      </sect2> 
      <sect2> 
       <title>Section2 1.1.2</title> 
       <para>text 1.1.2</para> 
      </sect2> 
      <sect2> 
       <title>Section2 1.1.3</title> 
       <para>text 1.1.3</para> 
      </sect2> 
      <sect2> 
       <title>Section2 1.1.4</title> 
       <para>text 1.1.4</para> 
      </sect2> 
     </sect1> 
     <sect1> 
      <title>Section1 1.2</title> 
      <sect2> 
       <title>Section2 1.2.1</title> 
      </sect2> 
      <sect2> 
       <title>Section2 1.2.2</title> 
       <sect3> 
        <title>Section3 1.2.2.1</title> 
       </sect3> 
       <sect3> 
        <title>Section3 1.2.2.2</title> 
       </sect3> 
      </sect2> 
     </sect1> 
    </chapter> 
    <chapter> 
     <title>Chapter 2</title> 
     <sect1> 
      <title>Section1 2.1</title> 
      <sect2> 
       <title>Section2 2.1.1</title> 
      </sect2> 
      <sect2> 
       <title>Section2 2.1.2</title> 
       <sect3> 
        <title>Section3 2.1.2.1</title> 
       </sect3> 
       <sect3> 
        <title>Section3 2.1.2.2</title> 
       </sect3> 
      </sect2> 
     </sect1> 
     <sect1> 
      <title>Section1 2.2</title> 
      <sect2> 
       <title>Section2 2.2.1</title> 
      </sect2> 
      <sect2> 
       <title>Section2 2.2.2</title> 
       <sect3> 
        <title>Section3 2.2.2.1</title> 
       </sect3> 
       <sect3> 
        <title>Section3 2.2.2.2</title> 
       </sect3> 
      </sect2> 
     </sect1> 
    </chapter> 
    <chapter> 
     <title>Chapter 3</title> 
     <sect1> 
      <title>Section1 3.1</title> 
      <sect2> 
       <title>Section2 3.1.1</title> 
      </sect2> 
      <sect2> 
       <title>Section2 3.1.2</title> 
       <sect3> 
        <title>Section3 3.1.2.1</title> 
       </sect3> 
       <sect3> 
        <title>Section3 3.1.2.2</title> 
       </sect3> 
      </sect2> 
     </sect1> 
     <sect1> 
      <title>Section1 3.2</title> 
      <sect2> 
       <title>Section2 3.2.1</title> 
      </sect2> 
      <sect2> 
       <title>Section2 3.2.2</title> 
       <sect3> 
        <title>Section3 3.2.2.1</title> 
       </sect3> 
       <sect3> 
        <title>Section3 3.2.2.2</title> 
       </sect3> 
      </sect2> 
     </sect1> 
    </chapter> 
</article> 

Transformation

<!-- table of contents --> 
<fo:block break-before='page'> 
    <fo:block font-size="16pt" font-weight="bold">TABLE OF CONTENTS</fo:block> 
    <xsl:for-each select="//chapter"> 
     <fo:block text-align-last="justify"> 
      <fo:basic-link internal-destination="{generate-id(.)}"> 
       <xsl:value-of select="count(preceding::chapter) + 1" /> 
       <xsl:text> </xsl:text> 
       <xsl:value-of select="title" /> 
       <fo:leader leader-pattern="dots" /> 
       <fo:page-number-citation ref-id="{generate-id(.)}" /> 
      </fo:basic-link> 
     </fo:block> 
    </xsl:for-each> 
</fo:block> 
+0

@empo TOC转换不存在。这是错的,所以我删除了它... – user219882

+0

@empo我更新了这个问题。这是我所能得到的。 – user219882

回答

6

当你输出<chapter>这将只有当你输出ID工作。 <fo:page-number-citation>中的@ref-id需要指向某些东西。

查看我的回答here


编辑 - 生成的ID

的实施例下面是一个例子的样式表。它将根据输入XML生成一个带有工作TOC的PDF。我使用Saxon 6.5.5和FOP进行了测试。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="node()|@*"> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:template> 

    <xsl:template match="/article"> 
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
     <fo:layout-master-set> 
      <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in"> 
      <fo:region-body margin="1in" margin-top="1.5in"/> 
      </fo:simple-page-master> 
     </fo:layout-master-set> 
     <fo:page-sequence master-reference="my-page"> 
     <fo:flow flow-name="xsl-region-body"> 
      <xsl:call-template name="genTOC"/> 
     </fo:flow> 
     </fo:page-sequence> 
     <xsl:apply-templates/> 
    </fo:root> 
    </xsl:template> 

    <xsl:template name="genTOC"> 
    <fo:block break-before='page'> 
     <fo:block font-size="16pt" font-weight="bold">TABLE OF CONTENTS</fo:block> 
     <xsl:for-each select="//chapter"> 
     <fo:block text-align-last="justify"> 
      <fo:basic-link internal-destination="{generate-id(.)}"> 
      <xsl:value-of select="count(preceding::chapter) + 1" /> 
      <xsl:text> </xsl:text> 
      <xsl:value-of select="title" /> 
      <fo:leader leader-pattern="dots" /> 
      <fo:page-number-citation ref-id="{generate-id(.)}" /> 
      </fo:basic-link> 
     </fo:block> 
     </xsl:for-each> 
    </fo:block> 
    </xsl:template> 

    <xsl:template match="title|para"> 
    <fo:block><xsl:value-of select="."/></fo:block> 
    </xsl:template> 

    <xsl:template match="chapter"> 
    <fo:page-sequence master-reference="my-page" id="{generate-id(.)}"> 
     <fo:flow flow-name="xsl-region-body"> 
     <xsl:apply-templates/> 
     </fo:flow> 
    </fo:page-sequence> 
    </xsl:template> 

</xsl:stylesheet> 
+0

如果我不想明确写入ID,该怎么办?我想生成ID,然后从中创建TOC。你能举个例子吗? – user219882

+0

@Tom - 请参阅我的编辑。如果您有任何问题,请告诉我。祝你好运! –

+0

谢谢你,我会在下周尝试你的解决方案,并让你知道。 – user219882