2011-09-02 7 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>. @ref-id в <fo:page-number-citation> нужно что-то указать.

См. Мой ответ here.


РЕДАКТИРОВАТЬ - Пример сгенерированного ID

Ниже приведен пример таблицы стилей. Он будет генерировать PDF с рабочим TOC из вашего входного XML. Я тестировал 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

И что, если я не хочу явно писать идентификатор. Я хотел бы сгенерировать идентификатор, а затем создать TOC. Не могли бы вы привести пример, пожалуйста? – user219882

+0

@Tom - см. Мое редактирование. Дайте мне знать, если у вас есть вопросы. Удачи! –

+0

Спасибо, я попробую ваше решение на следующей неделе и дам вам знать. – user219882

Смежные вопросы