2010-12-07 6 views
1

Ich habe Xml-Dokument, das ein Array/Liste von komplexen Elementen enthält. Ich möchte eine PDF-Datei erzeugen, so dass jedes komplexe Element auf einer neuen Seite angezeigt wird. Ich habe es für eine einzelne Seite arbeiten. Mein Beispiel-XML ist wie:Apache FOP: mehrseitige PDF aus XML-Array-Liste Iteration

<root> <list><x><1>10</1><2>20</2></x> <x><1>11</1><2>22</2></x> <x><1>13</1><2>23</2></x></list> </root> 

ich folgendes um

<xsl:for-each select="list/x"> 
<fo:page-sequence master-reference="my-page" initial-page-number="auto" format="1"> 
<fo:flow flow-name="xsl-region-body"> 
<fo:block> 
     ... my fo:table etc here 
     </fo:block> 
     <fo:block id="SV_RefID_PageTotal" /> 
</fo:page-sequence> 
</xsl:for-each> 

Ich erhalte Validierungsfehler versucht haben. Was mache ich falsch? Gibt es einen besseren Weg, dies zu tun? Danke

+0

Sie bitte Ihre Fehler aufzulisten. –

+0

Was sind die Validierungsfehler? Sind sie xsl-fo Validierungsfehler oder sind sie Fehler, weil Ihre Beispiel-XML nicht gut gebildet ist? –

Antwort

0

Da sie noch nicht veröffentlicht worden sind, nehme ich an, dass Ihre Fehler sind, weil Ihr XML nicht gut gebildet wird. Elementnamen dürfen nicht mit einer Zahl beginnen. (Siehe "XML-Namenskonventionen" in XML Elements)

Ich habe auch ein schnelles XSL Stylesheet, die gültigen XSL-FO generieren. Es ist wahrscheinlich nicht das, was du willst, aber vielleicht kannst du ein oder zwei Teile davon benutzen?

Modified XML-Beispiel

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <list> 
    <x> 
     <c1>10</c1> 
     <c2>20</c2> 
    </x> 
    <x> 
     <c1>11</c1> 
     <c2>22</c2> 
    </x> 
    <x> 
     <c1>13</c1> 
     <c2>23</c2> 
    </x> 
    </list> 
</root> 

XSL Stylesheet

<?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 indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="node()|@*"> 
    <xsl:choose> 
     <xsl:when test="name() = 'root'"> 
     <xsl:apply-templates/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy>   
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

    <xsl:template match="list"> 
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
     <fo:layout-master-set> 
     <fo:simple-page-master master-name="my-page"> 
      <fo:region-body/> 
     </fo:simple-page-master> 
     </fo:layout-master-set> 
     <xsl:apply-templates/> 
    </fo:root> 
    </xsl:template> 

    <xsl:template match="x"> 
    <fo:page-sequence master-reference="my-page" initial-page-number="auto" format="1"> 
     <fo:flow flow-name="xsl-region-body"> 
     <fo:table> 
      <fo:table-body> 
      <fo:table-row> 
       <xsl:apply-templates/> 
      </fo:table-row> 
      </fo:table-body> 
     </fo:table> 
     </fo:flow> 
    </fo:page-sequence> 
    </xsl:template> 

    <xsl:template match="c1|c2"> 
    <fo:table-cell> 
     <fo:block> 
     <xsl:apply-templates/> 
     </fo:block> 
    </fo:table-cell> 
    </xsl:template> 

</xsl:stylesheet> 

XSL-FO

<?xml version="1.0" encoding="UTF-8"?> 
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <fo:layout-master-set> 
     <fo:simple-page-master master-name="my-page"> 
     <fo:region-body/> 
     </fo:simple-page-master> 
    </fo:layout-master-set> 
    <fo:page-sequence master-reference="my-page" initial-page-number="auto" format="1"> 
     <fo:flow flow-name="xsl-region-body"> 
     <fo:table> 
      <fo:table-body> 
       <fo:table-row> 
        <fo:table-cell> 
        <fo:block>10</fo:block> 
        </fo:table-cell> 
        <fo:table-cell> 
        <fo:block>20</fo:block> 
        </fo:table-cell> 
       </fo:table-row> 
      </fo:table-body> 
     </fo:table> 
     </fo:flow> 
    </fo:page-sequence> 
    <fo:page-sequence master-reference="my-page" initial-page-number="auto" format="1"> 
     <fo:flow flow-name="xsl-region-body"> 
     <fo:table> 
      <fo:table-body> 
       <fo:table-row> 
        <fo:table-cell> 
        <fo:block>11</fo:block> 
        </fo:table-cell> 
        <fo:table-cell> 
        <fo:block>22</fo:block> 
        </fo:table-cell> 
       </fo:table-row> 
      </fo:table-body> 
     </fo:table> 
     </fo:flow> 
    </fo:page-sequence> 
    <fo:page-sequence master-reference="my-page" initial-page-number="auto" format="1"> 
     <fo:flow flow-name="xsl-region-body"> 
     <fo:table> 
      <fo:table-body> 
       <fo:table-row> 
        <fo:table-cell> 
        <fo:block>13</fo:block> 
        </fo:table-cell> 
        <fo:table-cell> 
        <fo:block>23</fo:block> 
        </fo:table-cell> 
       </fo:table-row> 
      </fo:table-body> 
     </fo:table> 
     </fo:flow> 
    </fo:page-sequence> 
</fo:root> 
+0

Es war mein Fehler, dass ich falsches XML in meinem Post gebildet habe, aber das ist in meinem realen Szenario nicht der Fall. Mein XML ist gut geformt und ist zu groß zum Posten. Das Problem, das ich sehe, ist, dass, sobald mein xml erzeugt wird, und ich xsl Umwandlung mache, um fo zu erzeugen, es einige Elemente verfehlt und einen leeren Tabellenkörper verursacht. Und hier bekomme ich die Validierungsausnahme. – pable

+0

Ich schätze Ihre Antwort sehr und bin froh, noch am selben Tag antworten zu können. Ihr Jungs seid toll. – pable

+0

Kann jemand mich zu einem Beispiel für die Wiederholung einer Liste in Apache fop umleiten –