2011-09-02 55 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