• ベストアンサー

XMLをxalanでXSL-FOに変換する

book.xmlとbook.xslでbook.foに変換にxalanで実行しました。 >java org.apache.xalan.xslt.Process -in book.xml -xsl book.xsl -out book.fo ところが、以下のようにエラーが出ました。 Exception in thread "main" java.lang.ClassCastException: org.apache.xalan.res.XSLTErrorResources_ja at org.apache.xalan.xslt.Process.main(Process.java:209) 何が原因なのでしょうか?xalan-j_2_4_1のxalan.jarとxercesImpl.jarにはCLASSPATH設定をしています。 <book.xml> <?xml version="1.0" encoding="Shift_JIS" ?> <?xml:stylesheet type="text/xsl" href="book.xsl" ?> <書籍管理> <書籍情報 ID="1"> <書籍名>スタイルシート辞典 第2版</書籍名> <著者>安川英明</著者> <出版社>翔泳社</出版社> <価格>1800</価格> </書籍情報> ・・・ <書籍管理> 文字数が多くなってすべてbook.xslがかけませんでした。 テーブル形式で表示するようしたいのです。 <xsl:template match="書籍管理"><fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> ・・・ <fo:table> <fo:table-column column-width="50mm"/> ・・・ <fo:table-body><fo:table-row><fo:table-cell><fo:block>書籍名</fo:block></fo:table-cell>・・・</fo:table-row> <xsl:apply-templates/> </fo:table-body> </fo:table> </fo:flow></fo:page-sequence> </fo:root></xsl:template> <xsl:template match="書籍情報"> <fo:table-row><xsl:apply-templates/></fo:table-row> </xsl:template> <xsl:template match="書籍名"> <fo:table-cell><fo:block><xsl:value-of select='.'/></fo:block></fo:table-cell> </xsl:template>

質問者が選んだベストアンサー

  • ベストアンサー
  • jo-ji
  • ベストアンサー率72% (26/36)
回答No.3

No.2で回答した者です。 とりあえず、java.net.MalformedURLException: no protocol: book.xslとメッセージが出ているのだから、XSLTの書き方を疑うよりも、URL(つまりパス)を疑うべきだと思います。 以下の実験をしてみたところ、同じエラーが出ました。 (1) 問題なく動作するXSLTスタイルシートを用意 (2) 日本語の名前の付いたフォルダを作り、そこにファイルを入れてみる (3) Xalanを呼び出す 日本語の名前の付いたフォルダに直接含まれていなくても、パスの途中に日本語の名前のフォルダがある(「デスクトップ」とか)とエラーになるようです。 したがって、パスの途中に日本語の名前のフォルダがないかどうか、チェックしてみて下さい。 ちなみに私は、日本語名や空白を含んだ名前のフォルダがパスに含まれない位置に、ファイルやツールをなるべく置くようにしています。コンピュータを使う場合の心がけのようなものです。

machitaka
質問者

お礼

ありがとうございます。 おっしゃった通り日本語名フォルダが有った為、エラーが出ていたようです。 FOファイルが無事作成できました。 最後行の心がけ私も実行します!

その他の回答 (2)

  • jo-ji
  • ベストアンサー率72% (26/36)
回答No.2

もしかして、Java2 SDK 1.4を使ってませんか? その場合は、Java実行時のオプションで、例えばxalan.jarとxercesImpl.jarがc:\xml_tool\xalan-j_2_4_0\binの中にある場合だと、以下のように指定すると、解決するかもしれません。 java -Djava.endorsed.dirs=c:\xml_tool\xalan-j_2_4_0\bin org.apache.xalan.xslt.Process -in book.xml -xsl book.xsl -out book.fo 私はこのエラーになったことがないのですが、参考URLにあるApacheのメーリングリストのアーカイブの中をClassCastExceptionで検索して、xalanに関係のありそうなところを見ると、この問題と対処法が載っていました。 Java2 1.4には標準でXML処理のインターフェイス(JAXP)の実装が組み込まれたために、最新のXerces, Xalanを使っているつもりでも、重複するクラスについてSDKに含まれる方を参照してしまうようです。1.4以上を使っている方で最新のXerces, Xalanを確実に使いたい場合には、今回のような問題がたとえなかったとしても、-Djava.endorsed.dirsでjarファイルのあるディレクトリを指定した方が良いようです。

参考URL:
http://marc.theaimsgroup.com/
machitaka
質問者

補足

確かにJava2 SDK 1.4を使っています。 教えていただいたように実行すると前のようなエラーは出なくなりました。 今度は、次のようなエラーが出たのですが、 XSLの書き方が間違っているからでしょうか? 何かおかしな点ありますか? (Location of error unknown)XSLT エラー (javax.xml.transform.TransformerConfigura tionException): javax.xml.transform.TransformerException: java.net.MalformedURLE xception: no protocol: book.xsl <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0"> <xsl:template match="書籍管理"> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" language="ja"> <fo:layout-master-set> <fo:simple-page-master master-name="page" page-height="300mm" page-width="300mm" margin-top="10mm" margin-bottom="10mm" margin-left="20mm" margin-right="20mm"> <fo:region-body margin-top="0mm" margin-bottom="10mm" margin-left="0mm" margin-right="0mm"/> <fo:region-after extent="10mm"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="page"> <fo:flow flow-name="xsl-region-body"> <fo:block font-weight="bold" font-size="36pt" line-height="48pt" font-family="MSGothic" color="blue"> 書籍情報 </fo:block> <fo:table background-color="#cfffcf"> <fo:table-column column-width="55mm"/> <fo:table-column column-width="30mm"/> <fo:table-column column-width="30mm"/> <fo:table-column column-width="30mm"/> <fo:table-column column-width="45mm"/> <fo:table-column column-width="40mm"/> <fo:table-column column-width="30mm"/> <fo:table-body> <fo:table-row> <fo:table-cell border-width="1mm" border-style="solid"> <fo:block font-size="18pt">書籍名</fo:block> </fo:table-cell> <fo:table-cell border-width="1mm" border-style="solid"> <fo:block font-size="18pt">著者</fo:block> </fo:table-cell> <fo:table-cell border-width="1mm" border-style="solid"> <fo:block font-size="18pt">出版社</fo:block> </fo:table-cell> <fo:table-cell border-width="1mm" border-style="solid"> <fo:block font-size="18pt">価格</fo:block> </fo:table-cell> <fo:table-cell border-width="1mm" border-style="solid"> <fo:block font-size="18pt">ISBN番号</fo:block> </fo:table-cell> <fo:table-cell border-width="1mm" border-style="solid"> <fo:block font-size="18pt">分類</fo:block> </fo:table-cell> <fo:table-cell border-width="1mm" border-style="solid"> <fo:block font-size="18pt">所有者</fo:block> </fo:table-cell> </fo:table-row> <xsl:apply-templates/> </fo:table-body> </fo:table> </fo:flow> </fo:page-sequence> </fo:root> </xsl:template> <xsl:template match="書籍情報"> <fo:table-row background-color="#ffffcf"> <xsl:apply-templates/> </fo:table-row> </xsl:template> <xsl:template match="書籍名"> <fo:table-cell border-width="1mm" border-style="solid"> <fo:block><xsl:value-of select='.'/></fo:block> </fo:table-cell> </xsl:template> <xsl:template match="著者"> <fo:table-cell border-width="1mm" border-style="solid"> <fo:block><xsl:value-of select='.'/></fo:block> </fo:table-cell> </xsl:template> <xsl:template match="出版社"> <fo:table-cell border-width="1mm" border-style="solid"> <fo:block><xsl:value-of select='.'/></fo:block> </fo:table-cell> </xsl:template> <xsl:template match="価格"> <fo:table-cell border-width="1mm" border-style="solid"> <fo:block><xsl:value-of select='.'/></fo:block> </fo:table-cell> </xsl:template> <xsl:template match="ISBN番号"> <fo:table-cell border-width="1mm" border-style="solid"> <fo:block><xsl:value-of select='.'/></fo:block> </fo:table-cell> </xsl:template> <xsl:template match="分類"> <fo:table-cell border-width="1mm" border-style="solid"> <fo:block><xsl:value-of select='.'/></fo:block> </fo:table-cell> </xsl:template> <xsl:template match="所有者"> <fo:table-cell border-width="1mm" border-style="solid"> <fo:block><xsl:value-of select='.'/></fo:block> </fo:table-cell> </xsl:template> </xsl:stylesheet>

  • tekebon
  • ベストアンサー率62% (36/58)
回答No.1

原因はClassCastExceptionですので「データ型があってないよ」ってことなんですが... Processクラスはapacheの提供するクラスでなのでバグなんですかねー.. ためしにソースをDLして209行目付近を見てみました ResourceBundle resbundle = (XSLMessages.loadResourceBundle( org.apache.xml.utils.res.XResourceBundle.ERROR_RESOURCES)); でAPIドキュメントを見てみると ResourceBundle XSLMessages.loadResourceBundle(String) String XResourceBundle.ERROR_RESOURCES となっているので問題なさそうです...うーむ ためしに自分のマシンにはいってるjaxpからxslファイルからhtmlへ 変換してみましたが問題なく変換できました。 そこで、 ・一度ほかのサンプルファイルを作成して実行してみる(FOじゃないやつとか) ・ほかのバージョンをDLして実行してみる と確認してみてはいかがでしょうか? あんまりまとまってないですねスミマセン

関連するQ&A