2010-12-07 6 views
1

J'ai un document xml qui contient un tableau/une liste d'éléments complexes. Je voudrais générer un fichier PDF tel que chaque élément complexe soit affiché sur une nouvelle page. Je l'ai travailler pour une seule page. Mon exemple XML est comme:Apache FOP: PDF de plusieurs pages à partir de l'itération de la liste de tableaux xml

<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> 

J'ai essayé ce qui suit autour

<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> 

Je reçois des erreurs de validation. Qu'est-ce que je fais mal? Y a-t-il une meilleure façon de le faire? Merci

+0

S'il vous plaît la liste de vos erreurs. –

+0

Quelles sont les erreurs de validation? S'agit-il d'erreurs de validation xsl-fo ou s'agit-il d'erreurs parce que votre exemple XML n'est pas bien formé? –

Répondre

0

Puisqu'ils n'ont pas encore été postés, je suppose que vos erreurs sont parce que votre XML n'est pas bien formé. Les noms d'éléments ne peuvent pas commencer par un nombre. (Voir "Règles de nommage XML" dans XML Elements)

J'ai également fait une feuille de style rapide XSL qui générera XSL-FO valide. Ce n'est probablement pas ce que vous voulez, mais peut-être pouvez-vous en utiliser un ou deux morceaux?

modifié Exemple XML

<?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> 

feuille de style 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 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

C'était mon erreur que j'ai formé le xml incorrect dans mon message, mais ce n'est pas le cas dans mon scénario réel. Mon fichier XML est bien formé et est trop volumineux pour être publié. Le problème que je vois est qu'une fois que mon xml est généré, et que je fais la transformation xsl pour générer fo, il manque certains éléments et crée un corps de tableau vide. Et c'est là que j'obtiens l'exception de validation. – pable

+0

J'apprécie grandement votre réponse et je suis heureux d'obtenir réponse le même jour. Vous êtes géniaux. – pable

+0

Quelqu'un peut-il me rediriger vers un exemple pour itérer une liste dans apache fop –

Questions connexes