Home
Über mich
Blog
Veröffentlichungen
IT-Trainings
Impressum


XSL-FO

Nun können wir daran gehen, die XSL-FO-Konvertierung zu starten, hier mit dem Kommando

fop 
   -xsl C:/wg/XSLFO1.xsl
   -xml C:/wg/Ort_Elemente.xml 
   -pdf C:/wg/FO2.pdf

Alternativ können wir auch hier mit ANT arbeiten; aus didaktischen Gründen habe ich hier noch das Ergebnis der Zwischentransformation "C:/wg/FO2.fo" aufgerufen, von dem aus der FO-Prozessor die Konvertierung nach "C:/wg/FO2.pdf" beginnt.

 <antcall target="runxsltransformation">
  <param name="poutput" value="C:/wg/FO2.fo" />
  <param name="pinput" value="C:/wg/Ort_Elemente.xml" />   
  <param name="pstyle" value="C:/wg/XSLFO1" />
  <param name="pprocessor" value="saxon" />
 </antcall>
 <antcall target="runSingleFOP">
  <param name="fodatei" value="C:/wg/FO2.fo" />
  <param name="out" value="C:/wg/FO2.pdf" />
 </antcall>

Als XSL-Stylesheet (XSLFO1.xsl) dient die folgende Implementierung, die ein einzelnes PDF-Dokument mit mehreren Seiten generiert. Für jeden Mensch-Node im XML Input wird eine separate fo:page-sequence definiert, mit einer sortierten, formatierten und numerierten Tabelle, deren Zeilen eine alternierende Farbe aufweisen. Zur besseren Orientierung werden die Region-Namen ausgegeben. Bitte beachten Sie das geänderte Layout in fo:region-body mit margin-left="10mm".

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xs="http://www.w3.org/2001/XMLSchema"
     xmlns:fo="http://www.w3.org/1999/XSL/Format">
 <xsl:decimal-format 
      name="euro"
      decimal-separator=","
      grouping-separator="."/>
 <xsl:template match="/">
  <fo:root>
   <fo:layout-master-set>
    <fo:simple-page-master 
        margin-right="15mm"
        margin-left="2cm" 
        margin-bottom="1cm" 
        margin-top="2cm" 
        page-width="21cm"
        page-height="297mm" 
        master-name="layout1">
     <fo:region-body 
         margin-right="5cm" 
         margin-bottom="15mm"
         margin-top="35mm" 
         margin-left="10mm" 
         background-color="white" />
     <fo:region-before extent="30mm" 
         background-color="#FFFF33" />
     <fo:region-after extent="7mm" 
         background-color="#B0E0E6" />
     <fo:region-start 
         extent="30mm" 
         background-color="#CC99FF" />
     <fo:region-end 
         extent="45mm" 
         background-color="#CEFF00" />
    </fo:simple-page-master>
   </fo:layout-master-set>

Für jeden Mensch-Node im XML Input wird eine separate fo:page-sequence definiert:

   <xsl:for-each select="Orte/Ort/Mensch">
    <fo:page-sequence 
        master-reference="layout1">
     <fo:static-content 
         flow-name="xsl-region-before">
      <fo:block 
          text-align="left" 
          space-after="1cm">xsl-region-before</fo:block>
      <fo:block text-align="left">An:</fo:block>
      <fo:block 
          text-align="left" 
          font-weight="bold" 
          font-size="9pt"
          color="gray">
       <xsl:value-of select="concat(vorname, ' ', name)" />
      </fo:block>
      <fo:block 
          text-align="left" 
          font-size="9pt" 
          color="gray">
       <xsl:value-of select="../name" />
      </fo:block>
     </fo:static-content>
     <fo:static-content 
         flow-name="xsl-region-end">
       <fo:block 
           text-align="left" 
           space-after="1cm">xsl-region-end</fo:block>
        <fo:block 
            text-align="left" 
            font-size="9pt" 
            color="gray">Absender: </fo:block>
        <fo:block 
            text-align="left" 
            color="gray" 
            font-weight="bold" 
            font-size="9pt"
            space-before="2mm">Wilfried Grupe</fo:block>
     </fo:static-content>
     <fo:static-content 
         flow-name="xsl-region-start">
      <fo:block 
         text-align="center">xsl-region-start</fo:block>
     </fo:static-content>
     <fo:static-content 
         flow-name="xsl-region-after">
      <fo:table table-layout="fixed" width="100%">
       <fo:table-body>
        <fo:table-row>
         <fo:table-cell>
          <fo:block 
              text-align="left" 
              font-size="4pt" 
              color="gray">Wilfried Grupe</fo:block>
          <fo:block 
              text-align="right" 
              font-size="4pt" 
              color="gray">www.wilfried-grupe.de
          </fo:block>
         </fo:table-cell>
        </fo:table-row>
       </fo:table-body>
      </fo:table>
     </fo:static-content>

Nun kommt die eigentliche sortierte, formatierte und numerierte Tabelle, deren Zeilen eine alternierende Farbe aufweisen:

     <fo:flow flow-name="xsl-region-body">
      <fo:block 
          space-after="2cm" 
          text-align="center">xsl-region-body</fo:block>
      <fo:table 
         table-layout="fixed" width="100%">
       <fo:table-body>
        <xsl:for-each select="/Orte/Ort/Mensch">
        <xsl:sort select="Gehalt" 
            data-type="number" order="descending"/>
         <fo:table-row>
         <xsl:if test="position() mod 2=0">
         <xsl:attribute 
            name="background-color">lightgrey</xsl:attribute>
         </xsl:if>
          <fo:table-cell>
           <fo:block>
            <xsl:number value="position()" format="I"/>
           </fo:block>
          </fo:table-cell>
          <fo:table-cell>
           <fo:block>
            <xsl:value-of select="vorname" />
           </fo:block>
          </fo:table-cell>
          <fo:table-cell>
           <fo:block>
            <xsl:value-of select="name" />
           </fo:block>
          </fo:table-cell>
          <fo:table-cell>
           <fo:block>
            <xsl:value-of select="../name" />
           </fo:block>
          </fo:table-cell>
          <fo:table-cell>
           <fo:block text-align="right">            
            <xsl:value-of 
                select="format-number(Gehalt, 
                        '#.###,00 &#8364;', 'euro')"/> 
           </fo:block>
          </fo:table-cell>
         </fo:table-row>
        </xsl:for-each>
       </fo:table-body>
      </fo:table>
     </fo:flow>
    </fo:page-sequence>
   </xsl:for-each>
  </fo:root>
 </xsl:template>
</xsl:stylesheet>

pic/FO3.jpg

qrpic/FO1_2.jpg

wg / 9. Oktober 2017




Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf (info10@wilfried-grupe.de).



Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

Mobil: 0151. 750 360 61 * eMail: info10@wilfried-grupe.de