2013-07-03 2 views
4

В настоящее время у меня есть XSL-файл, который я использую для преобразования XML в формат FO (XSL-FO). Единственная проблема с нижними колонтитулами. У меня есть требование отображать текстовую ссылку из нижнего колонтитула каждой из страниц на одну из других страниц. Это означает, что мне нужно сделать текст нижнего колонтитула динамичным. Например, вот некоторый абстрактный текст из каждой страницы:XSL-FO нижний колонтитул в статическом, но динамическом содержимом?

page 1: Topic A 
page 2: Topic B 
page 3: Topic C, Subtopic of A 
page 4: Topic D, Subtopic of A 
page 5: Topic E, Subtopic of B 

Представьте себе «Подраздел» часть в качестве колонтитула для отображения на каждую страницу.

Рассмотрим следующий XML:

<DATA_DS> 
    <LIST_ITEMS> 
     <ITEMS> 
      <isChild>0</isChild> 
      <myvalue>abc</myvalue> 
      <isLastChild>0</isLastChild> 
     </ITEMS> 
     <ITEMS> 
      <isChild>1</isChild> 
      <myvalue>def</myvalue> 
      <isLastChild>0</isLastChild> 
     </ITEMS> 
     <ITEMS> 
      <isChild>1</isChild> 
      <myvalue>ghi</myvalue> 
      <isLastChild>0</isLastChild> 
     </ITEMS> 
     <ITEMS> 
      <isChild>1</isChild> 
      <myvalue>xyz</myvalue> 
      <isLastChild>1</isLastChild> 
     </ITEMS>   
    </LIST_ITEMS> 
</DATA_DS> 

и этот XSL:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
    <fo:root> 
     <fo:layout-master-set> 
      <fo:simple-page-master master-name="parentLOBPage-master" page-width="11in" page-height="8.5in" margin-left="1.3in" margin-right="0.65in" margin-top="0.35in" margin-bottom="0.35in"> 
       <fo:region-body region-name="body" margin-top="0.5in" margin-right="0.65in"/> 
       <fo:region-after region-name="footer" extent="14mm" /> 
      </fo:simple-page-master> 

      <fo:simple-page-master master-name="childLOBPage-master" page-width="11in" page-height="8.5in" margin-left="1.3in" margin-right="0.65in" margin-top="0.35in" margin-bottom="0.35in"> 
       <fo:region-body region-name="body" margin-top="0.5in" margin-right="0.65in"/> 
       <fo:region-after region-name="footer" extent="14mm"/> 
      </fo:simple-page-master> 

      <fo:page-sequence-master master-name="parentLOBPage"> 
      <fo:repeatable-page-master-reference 
       master-reference="parentLOBPage-master"/> 
      </fo:page-sequence-master> 

      <fo:page-sequence-master master-name="childLOBPage"> 
      <fo:repeatable-page-master-reference 
       master-reference="childLOBPage-master"/> 
      </fo:page-sequence-master> 
     </fo:layout-master-set> 

      <xsl:apply-templates/> 

    </fo:root> 
    </xsl:template> 


    <xsl:template match="DATA_DS"> 
    <xsl:for-each-group select="LIST_ITEMS/ITEMS" 
         group-adjacent="isChild"> 

     <xsl:choose> 
     <xsl:when test="isChild = 0"> 
      <fo:page-sequence master-reference="parentLOBPage"> 


        <fo:static-content flow-name="footer"> 

          <fo:table width="100%" table-layout="fixed" margin-top="5mm"> 
           <fo:table-column column-width="80%"/> 
           <fo:table-column column-width="20%"/>        

           <fo:table-body> 
            <fo:table-row> 
            <fo:table-cell> 
              <fo:block text-align="left" font-family="Arial" font-size="7pt" font-weight="normal">parent footer</fo:block> 
            </fo:table-cell> 
            <fo:table-cell> 
             <fo:block text-align="right" font-family="Arial" font-size="7pt" font-weight="normal">Page <fo:page-number/> of <fo:page-number-citation ref-id="last-page" /></fo:block> 
            </fo:table-cell> 
           </fo:table-row> 
          </fo:table-body> 
         </fo:table> 

         </fo:static-content>       

      <fo:flow flow-name="body"> 
       <xsl:for-each select="current-group()"> 
       <xsl:apply-templates select="."/> 
       </xsl:for-each> 
      </fo:flow> 
      </fo:page-sequence> 
     </xsl:when> 

     <xsl:otherwise> 
      <fo:page-sequence master-reference="childLOBPage"> 
        <fo:static-content flow-name="footer"> 
          <fo:table width="100%" table-layout="fixed" margin-top="5mm"> 
           <fo:table-column column-width="80%"/> 
           <fo:table-column column-width="20%"/>        

           <fo:table-body> 
            <fo:table-row> 
            <fo:table-cell> 
              <fo:block text-align="left" font-family="Arial" font-size="7pt" font-weight="normal">child footer: <xsl:value-of select="myvalue"/></fo:block> 
            </fo:table-cell> 
            <fo:table-cell> 
             <fo:block text-align="right" font-family="Arial" font-size="7pt" font-weight="normal">Page <fo:page-number/> of <fo:page-number-citation ref-id="last-page" /></fo:block> 
            </fo:table-cell> 
           </fo:table-row> 
          </fo:table-body> 
         </fo:table> 

         </fo:static-content>       

      <fo:flow flow-name="body"> 

       <xsl:for-each select="current-group()"> 
       <xsl:apply-templates select="."/> 
       </xsl:for-each> 
       <fo:block id="last-page"/> 
      </fo:flow> 
      </fo:page-sequence> 
     </xsl:otherwise> 

     </xsl:choose> 
    </xsl:for-each-group> 
    </xsl:template> 


    <xsl:template match="ITEMS"> 

      <fo:table width="100%" table-layout="fixed" margin-top="5mm"> 
       <fo:table-column column-width="20%"/> 
       <fo:table-column column-width="80%"/>        

       <fo:table-body> 
        <fo:table-row> 
        <fo:table-cell> 
          <fo:block text-align="left" font-family="Arial" font-size="10pt" font-weight="bold">big table</fo:block> 
         </fo:table-cell> 
        <fo:table-cell> 
          <fo:block text-align="left" font-family="Arial" font-size="10pt" font-weight="bold">some stuff</fo:block> 
         </fo:table-cell>            
        </fo:table-row> 
       </fo:table-body> 
      </fo:table> 

     <xsl:if test="isChild = 1 and isLastChild = 0"> 
       <fo:block page-break-after="always"/> 
      </xsl:if> 

    </xsl:template> 
</xsl:stylesheet> 

Так как я обернуть большую часть содержимого каждой страницы в фо: стол, а некоторые таблицы перелива на 2+ страниц, я не могу просто поместить «динамический текст нижнего колонтитула» после каждой таблицы, потому что тогда он не будет отображаться на каждой странице.

Итак, я полагаю, что мое использование fo: static-content не подходит, хотя оно делает то, что мне нужно для динамического отображения номеров страниц (например, страницы x of y). Вывод показывает, что для каждой страницы нижнего нижнего уровня значение отображается как «def», что является первым «дочерним» в списке. Итак, fo: static-content заселяет себя при первом запуске и не обновляется для последующих страниц ... поэтому мой подход неверен. Мне нужно руководствоваться тем, как пересмотреть мой подход ...

Любые предложения по поводу того, как я могу использовать нижние колонтитулы, которые мне нужны для моей ситуации XSL-FO? Спасибо ...

ответ

5

Ваш код не имеет надлежащей структуры для динамического содержимого в статическом контенте.

Концепция, в которой вы отсутствуете, заключается в том, что ваш нижний колонтитул должен «извлекать маркеры», который вы устанавливаете в точках «на лету» в потоке. Один нижний колонтитул для всех страниц извлекает один класс маркера из содержимого страниц, и вы меняете маркер в точках вашего потока, а поиск получает последний маркер (или другие параметры).

Для этого вам нужен только один нижний колонтитул с битом «Страница x of y», и вам нужно включить элемент, который извлекает маркер определенного класса. Затем, в вашем потоке, со всеми вашими темами и подтемами, и когда вы добираетесь до первого элемента каждого, вы определяете маркер с текстом, который хотите видеть в нижнем колонтитуле.

Выход XSL-FO ваш XSLT нужно производить вдоль линий:

<fo:static-content> 
    ... page x of y stuff ... 
    <fo:retrieve-marker retrieve-class-name="topic"/> 
    </fo:static-content> 
    <fo:flow> 
    <fo:table> 
     ... 
     <fo:table-cell> 
     <fo:marker marker-class-name="topic">Topic A</fo:marker> 
     ... 
     <fo:table-cell> 
     <fo:marker marker-class-name="topic">Topic B</fo:marker> 
     ... 
     <fo:table-cell> 
     <fo:marker marker-class-name="topic">Topic C, Subtopic of A</fo:marker> 
     ... 
     <fo:table-cell> 
     <fo:marker marker-class-name="topic">Topic D, Subtopic of A</fo:marker> 
     ... 
     <fo:table-cell> 
     <fo:marker marker-class-name="topic">Topic E, Subtopic of B</fo:marker> 

Я предлагаю вам просмотреть кадры под названием «Динамическое содержание в статическом содержании» на стр 257 бесплатно «Попробуйте и купить»предварительный просмотр моего PDF книги по адресу:

http://www.CraneSoftwrights.com/training/#pfux

есть нюансы атрибутов для поиска и размещения маркеров, описанных там, с диаграммами.

+0

Спасибо! Функциональность маркеров - это то, что я искал ... – Kevin

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