Frage

Ich habe mit einigen seltsamen Verhalten von Geck kämpfen 0,95 (weiß nicht, ob ich tue etwas nicht stimmt, oder wenn es eine Arbeit um).

Ich habe eine XML Auto erzeugt wie folgt:

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

(Hinweis: Dies ist ein verspottet Beispiel, aber ich habe eine sehr ähnliche Notwendigkeit, wo ich brauche Berichte am Ende eines Auftrags zu erzeugen mit sevaral colums zu roleTypes)

verwandt

Mein Ziel ist es, die oben genannten Daten im PDF angezeigt werden wie folgt:

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

I verwendet xsl: for-Schleife über jeweils RoleTypes / * Elemente Tabellenspalten zu definieren, und dynamisch konstruiert XPath-Ausdruck dann (unter Verwendung von dyn: bewerten der EXSLT) zu erhalten, Daten für die Zellen, die entsprechen den Rollen (dev, qa und doc).

Ihr XSL-Stylesheet funktioniert wie erwartet, wenn ich es durch einen Pre-Prozessor (xsltproc) laufen erzeugen .fo, und verwenden Sie dann Geck dieses .fo in ein PDF zu konvertieren. Aber, wenn ich direkt verwenden Geck (das heißt Schritt: Geck -xml blah.xml -xsl blah.xsl -pdf out.pdf), ich bin komisch Ergebnisse zu erzielen - nur die erste Spalte Daten (das heißt die erste Kind-Element von ‚RoleTypes‘, in diesem Beispiel - ‚dev‘) und der Rest der Spalten sind leer. Ich habe auch .fo erste produzieren versucht, mit Geck selbst (-foout Option) und dann mit fop die pdf zu erzeugen, bekommen aber das gleiche Ergebnis, wird das heißen Daten nur in dem angezeigten Spalte, entspricht das erste Child-Element des Elements RoleTypes. Ist das ein Bug mit Geck (wie es scheint zu erkennen dyn: bewerten, aber kein vollständigen Job)?

Ich würde wirklich wie die einzelnen Schritt Geck verwenden, damit würde ich nicht brauchen zusätzliche Tools auf der Client-Box bereitstellen (wie xsltproc usw.).

Hier ist das kritische Segment des Sheet I verwendet haben:

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

Danke

War es hilfreich?

Lösung

Dies ist nicht das allgemeine Problem der Verwendung von dyn beantworten: evaluate in FOP, aber für dieses bestimmte Schema und Problem, dynamische Auswertung ist nicht erforderlich. Sie können den Namen () Funktion verwenden, um die Knotennamen übereinstimmen. Wenn Sie die innere Schleife Ihres Beispiel ersetzen mit:

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

Sie werden die Ausgabe erhalten Sie wollten.

Andere Tipps

Wie bereits erwähnt wurde, unter http://markmail.org/message/np4t6fe4nsmr4vag dies nicht direkt ist ein FOP Problem, sondern ein mit dem Standard-XSLT-Prozessor, der in Ihrer Java-Installation aktiv ist. Der XSLT-Prozessor muß explizit ersetzt werden, wie hier beschrieben: http://xml.apache.org/xalan-j/faq. html # faq-N100EF

Natürlich können Sie auch auf dem Einsatz xsltproc weiterhin nur für den XSL-FO zu erzeugen und dann FOP die FO-Datei füttern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top