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:スタイルシート>
ありがとう