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