マイナス×マイナス

メンヘラ人工知能エンジニアのブログ/ 博士(工学)

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.apachesed で 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