fop が No element mapping definition found for ... "destination" で失敗するときの対処法
うまいタイトルが思い浮かばなかった。
さて、最近 docbook を使っているのだけれど、docbook を XSL-FO 経由で PDF に変換しようとすると以下のようなエラーが出てしまう。
org.apache.fop.apps.FOPException: file://home/hoge/xxx/docbook.fo:1:12980: Error(1/12980): No element mapping definition found for (Namespace URI: "http://xml.apache.org/fop/extensions", Local Name: "destination")
これは fopのMLの記事によると、
The DocBook-independent answer is: The http://xml.apache.org/fop/extensions
namespace has changed to http://xmlgraphics.apache.org/fop/extensions
for FOP versions 0.90 and higher.
とのことで、namespace の URLが変わっているらしい。そこで、xml.apacheを sed で xmlgraphics.apache に無理やり置換することにした。本当は、xsltprocで .fo を作るときに、XSLTで対処するべきなのだろう。
具体的には、以下の要領で docbook を PDF にしている。
xsltproc \ -o tmp.fo \ ../pdf.xsl \ ../docbook.xml sed 's/xml.apache/xmlgraphics.apache/g' tmp.fo > docbook.fo fop \ -c ../conf/fop.xconf \ -fo docbook.fo \ -pdf docbook.pdf