Question

J'ai eu du mal avec un comportement bizarre de FOP 0,95 (ne sais pas si je fais quelque chose de mal, ou s'il y a un travail autour).

J'ai un fichier XML généré automatiquement comme suit:

<projectteam>
 <projectname>Report Generation</projectname>
 <RoleTypes>
         <dev/>
         <qa/>
         <doc/>
 </RoleTypes>
 <member>
   <name>John</name>
   <dev>200</dev>
 </member>
 <member>
   <name>Max</name>
   <dev>60</dev>
 </member>
 <member>
   <name>Henry</name>
   <qa>80</qa>
 </member>
 <member>
   <name>Peter</name>
   <qa>40</qa>
 </member>
</projectteam>

(Note: Ceci est un exemple moqué, mais j'ai un besoin très similaire où j'ai besoin pour générer des rapports à la fin d'un travail avec sevaral colums semblable à roleTypes)

Mon but est d'afficher les données ci-dessus en format pdf comme suit:

Name   | dev | qa  | doc |
--------------------------
John   | 100 |     |     |
Max    |  60 |     |     |
Henry  |     |  80 |     |
Peter  |     |  40 |     |

je xsl: for-each pour boucler sur RoleTypes / * éléments pour définir les colonnes de la table, et puis construit dynamiquement expression XPath (en utilisant dyn: évaluer de EXSLT) pour obtenir données pour les cellules qui correspondent aux rôles (dev, qa et doc).

Mon xsl fonctionne stylesheet comme prévu si je le lance à travers un pré-processeur (xsltproc) pour générer .FO, et ensuite utiliser FOP pour convertir cette .FO en pdf. Mais, quand je l'utilise directement FOP (à savoir seule étape: FOP -xml blah.xml -xsl blah.xsl -pdf out.pdf), je suis d'obtenir des résultats étranges - seules les données de la première colonne (à savoir la première élément enfant de « RoleTypes », dans cet exemple - « dev ») et reste des colonnes sont vides. J'ai aussi essayé la production .FO d'abord avec lui-même FOP (en option -foout), puis en utilisant FOP pour générer le pdf, mais a obtenu le même résultat, à savoir les données s'affiche uniquement dans la colonne qui correspond au premier élément enfant de l'élément RoleTypes. Est-ce un bug avec FOP (comme il semble reconnaître dyn: évaluer, mais ne fait pas un travail complet)?

Je voudrais vraiment utiliser FOP une seule étape pour que je ne aurais pas besoin de déployer des outils supplémentaires sur la boîte client (comme xsltproc etc).

Voici le segment critique de la feuille de style que je me sers:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  xmlns:dyn="http://exslt.org/dynamic">

<xsl:template match="projectteam">
 ...
 <fo:table table-layout="fixed" width="100%">
  <fo:table-column column-width="3cm"/>
  <xsl:for-each select="RoleTypes/*">
   <fo:table-column column-width="1cm"/>
  </xsl:for-each>

  <fo:table-body>
  <xsl:for-each select="member">
   <xsl:variable name="Member" select="."/>
   <fo:table-row>
    <fo:table-cell>
     <fo:block> <xsl:value-of select="name"/></fo:block>
    </fo:table-cell>

    <xsl:for-each select="../RoleTypes/*">
     <xsl:variable name="roleName" select="concat('$Member/', name(.))"/>
     <fo:table-cell><fo:block>

     <!-- This is where the problem is with fop; although the same statement works fine with xsltproc?? -->

      <xsl:value-of select="dyn:evaluate($roleName)"/>
     </fo:block></fo:table-cell>
    </xsl:for-each>
   </fo:table-row>
  </xsl:for-each>
  </fo:table-body>
 </fo:table>
</xsl:template>
</xsl:stylesheet>

Merci

Était-ce utile?

La solution

Cela ne répond pas au problème général de l'utilisation dyn: évaluer dans FOP, mais pour ce schéma particulier et problème, l'évaluation dynamique n'est pas nécessaire. Vous pouvez utiliser la fonction nom () pour faire correspondre les noms de nœuds. Si vous remplacez la boucle interne de votre exemple avec:

                    <xsl:for-each select="../RoleTypes/*">
                        <xsl:variable name="roleName" select="name(.)"/>
                        <fo:table-cell><fo:block>
                            <xsl:value-of select="$Member/*[name()=$roleName]"/>
                        </fo:block></fo:table-cell>
                    </xsl:for-each>

Vous obtiendrez la sortie que vous vouliez.

Autres conseils

Comme on l'a noté à http://markmail.org/message/np4t6fe4nsmr4vag ce n'est pas directement un problème de FOP mais avec le processeur XSLT par défaut est activé dans votre installation de Java. Le processeur XSLT peut devoir être remplacé comme décrit ici explicitement: http://xml.apache.org/xalan-j/faq. html # faq-N100EF

Bien sûr, vous pouvez aussi simplement continuer à utiliser xsltproc pour générer le XSL-FO et alimenter FOP le fichier FO.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top