Dokumentenformate / Formatting Objects / XSL-FO

XSL-FO

XSL-FO

Um XML mit Hilfe von XSL nach PDF (png, rtf, tiff, png, txt, ps, pcl) transformieren zu können, ist zunächst eine Konvertierung in das Zwischenformat "FO" erforderlich.

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

wg / 2. Januar 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







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: info2018@wilfried-grupe.de

www.wilfried-grupe.de/FO1_2.html