干し石榴長文用

長文以外はTumblrへ徐々に移します。

XSLT2.0 on AppEngine for Java まとめ

AppEngineにてXSLTベースでwota-music.infoを作ってみましたのですが,途中いろいろ詰んだと思いつつ蜘蛛の糸をたどる感じに解決できたのでメモします.

  1. vosaoプロジェクトがリビルドしたSaxon9.2を入手してlibに追加する
  2. TransformerFactoryインスタンス入手時にSaxon実装のクラス名を指定する
  3. URIResolverを実装し,TransformerFactoryインスタンスにセットする

以下経緯など

※1
デフォルトのXSLTプロセッサ実装がAppEngine的にブラックなためです.とりあえずXalanを使ってましたが,主にxsl:attributeでselectを使いたいという理由によりXSLT2.0対応のSaxonに替えました.が,公式サイトから入手したSaxon9.2HEはデプロイ環境でクラスのロードに失敗.

java.lang.SecurityException: SHA1 digest error for net/sf/saxon/TransformerFactoryImpl.class

SHA1 digest errorて,どうしたらいいの.ということでgoogle先生に色々訊ねてvosaoプロジェクトのとあるIssuesにたどり着きました.すると下の方に

Try to update saxon-9.2.jar from
http://code.google.com/p/vosao/source/browse/#svn/repository/saxon/saxon/9.2

ということでAppEngine用にリビルドされたと思しきjarを入手しまして解決しました.ありがとうkinyeloさん

※2
引数がある方のファクトリに"net.sf.saxon.TransformerFactoryImpl"を指定して呼びます.classLoaderの方はnullでOKです

※3
Class#getResource()でスタイルシートをロードするようにしたのですが,その場合スタイルシート内にてxsl:importで相対パスを解決できないためです.getResource()したものをStreamSourceにラップして返します.