2009-10-05 5 views
0

J'ai lutté avec un comportement étrange de fop 0,95 (ne sais pas si je fais quelque chose de mal, ou s'il y a un travail autour).XSLT fop-0.95: problème avec dyn: évaluer

J'ai un auto généré XML 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 emploi avec sevaral colums semblable à roleTypes)

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

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

je xsl: à boucle for-each sur roleTypes/* les éléments pour définir les colonnes de la table, et ensuite l'expression XPath construite dynamiquement (en utilisant dyn: evaluate de exslt) pour obtenir les données pour les cellules qui correspondent aux rôles (dev, qa et doc).

Ma feuille de style xsl fonctionne comme prévu si je l'exécute via un pré-processeur (xsltproc) pour générer .fo, puis j'utilise fop pour convertir ce fichier .fo en format pdf. Mais, quand j'utilise fop directement (c'est-à-dire une seule étape: fop -xml blah.xml -xsl blah.xsl -pdf out.pdf), je reçois des résultats bizarres - seulement les données de la première colonne (ie le premier enfant l'élément 'RoleTypes', dans cet exemple - 'dev') et le reste des colonnes sont vides. J'ai également essayé de produire .fo d'abord avec fop lui-même (option -foout), puis en utilisant fop pour générer le pdf, mais j'ai obtenu le même résultat, c'est-à-dire que la colonne correspond au premier enfant élément de l'élément RoleTypes. Est-ce un bug avec fop (car il semble reconnaître dyn: évaluer, mais ne fait pas un travail complet)?

Je voudrais vraiment utiliser le fop unique afin que je n'aie pas besoin de pour déployer des outils supplémentaires sur le 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

Répondre

1

Cela ne résout pas le problème général de l'utilisation de dyn: evaluate dans FOP, mais pour ce schéma et ce problème particulier, l'évaluation dynamique n'est pas nécessaire. Vous pouvez utiliser la fonction name() pour faire correspondre les noms de noeud. Si vous remplacez la boucle interne de votre exemple par:

    <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 souhaitée.

+0

Merci pour votre suggestion! En ce qui concerne le problème principal, il a été causé par le moteur XALAN xslt. Une fois que je l'ai remplacé avec Saxon, la transformation (et FOP) a bien fonctionné.J'ai créé un rapport de bogue pour XALAN pour ce problème, et j'ai aussi changé mon code pour que je n'aie plus besoin d'utiliser dyn: évaluer plus. –