1

fop 0.95 の奇妙な動作に苦労しています (何か間違っているのか、回避策があるのか​​わかりません)。

次のような自動生成された XML があります。

<プロジェクトチーム>
 <projectname>レポート生成</projectname>
 <ロールタイプ>
         <開発/>
         <qa/>
         <ドキュメント/>
 </役割の種類>
 <メンバー>
   <name>ジョン</name>
   <dev>200</dev>
 </メンバー>
 <メンバー>
   <name>マックス</name>
   <dev>60</dev>
 </メンバー>
 <メンバー>
   <name>ヘンリー</name>
   <qa>80</qa>
 </メンバー>
 <メンバー>
   <name>ピーター</name>
   <qa>40</qa>
 </メンバー>
</プロジェクトチーム>

(注: これはモックアップの例ですが、ジョブの最後に、roleTypes に似たいくつかの列を使用してレポートを生成する必要があるという、非常によく似たニーズがあります)

私の目標は、上記のデータを次のように pdf で表示することです。

名前 | 開発 | か | ドキュメント |
--------------------------
ジョン | 100 | | | | |
マックス | 60 | | | | |
ヘンリー | | | 80 | | |
ピーター | ピーター | | | 40 | | |

xsl:for-each を使用して RoleTypes/* 要素をループ処理し、テーブルの列を定義してから、(exslt の dyn:evaluate を使用して) XPath 式を動的に構築し、役割 (dev、qa、およびドキュメント)。

私の xsl スタイルシートは、プリプロセッサ (xsltproc) を介して実行して .fo を生成し、次に fop を使用してこの .fo を pdf に変換すると、期待どおりに機能します。しかし、fop を直接使用すると (つまり、単一のステップ: fop -xml blah.xml -xsl blah.xsl -pdf out.pdf)、奇妙な結果が得られます - 最初の列のデータのみ (つまり、' の最初の子要素) RoleTypes」、この例では「dev」) で、残りの列は空白です。また、最初に fop 自体 (-foout オプション) を使用して .fo を生成し、次に fop を使用して pdf を生成しようとしましたが、同じ結果が得られました。つまり、RoleTypes の最初の子要素に対応する列にのみデータが表示されます。エレメント。これは fop のバグですか?

クライアントボックスに追加のツール(xsltprocなど)を展開する必要がないように、シングルステップfopを使用したいと思います。

これが私が使ってきたスタイルシートの重要な部分です:

<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:テーブル本体>
  <xsl:for-each select="member">
   <xsl:variable name="メンバー" select="."/>
   <fo:テーブル行>
    <fo:テーブルセル>
     <fo:block> <xsl:value-of select="name"/></fo:block>
    </fo:テーブルセル>

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

     <!-- これが fop の問題です。同じステートメントが xsltproc で正常に機能しますが?? -->

      <xsl:value-of select="dyn:evaluate($roleName)"/>
     </fo:block></fo:テーブルセル>
    </xsl:for-each>
   </fo:テーブル行>
  </xsl:for-each>
  </fo:テーブル本体>
 </fo:表>
</xsl:テンプレート>
</xsl:スタイルシート>

ありがとう

4

2 に答える 2

2

これは、FOP で dyn:evaluate を使用する一般的な問題には答えませんが、この特定のスキーマと問題については、動的評価は必要ありません。name() 関数を使用して、ノード名を一致させることができます。例の内側のループを次のように置き換えると:

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

必要な出力が得られます。

于 2009-10-24T15:16:04.050 に答える
1

http://markmail.org/message/np4t6fe4nsmr4vagで指摘されているように、これは直接的な FOP の問題ではなく、Java インストールでアクティブになっているデフォルトの XSLT プロセッサの問題です。ここで説明されているように、XSLT プロセッサを明示的に置き換える必要がある場合があります: http://xml.apache.org/xalan-j/faq.html#faq-N100EF

もちろん、引き続き xsltproc を使用して XSL-FO を生成し、FO ファイルを FOP にフィードすることもできます。

于 2009-10-06T05:52:43.673 に答える