DITA-OTでのSaxonの起動方法(2)

スタイルシートのテンプレートのスタイルが安定していれば滅多にでないのですが、新たに機能追加を行って毛色の違うテンプレートをインポートしたりすると次のようなエラーに出くわす場合があります.

     [xslt] Loading stylesheet D:\DITA-OT1.7.5\plugins\pdf5\xsl\dita2fo_shell.xsl
     [xslt] D:\DITA-OT1.7.5\plugins\pdf5\xsl\dita2fo_cover_print.xsl:780: Fatal Error! An empty sequence is not allowed as the value of parameter $prmTopicRef
     [xslt] Failed to process D:\My_Documents\sample\temp\GUID-85B168AC-A89F-4862-9C1C-B9832FF6EAE9_MERGED.xml

これはテンプレートで

<xsl:param name="prmTopicRef" as="element()" reqired="yes"/>

となっていて、呼び出し側から$prmTopicRefをヌルシーケンスで渡してしまった場合に発生します.これはJAXPでSaxonを呼び出した場合のログですが、残念ながらこれ以上の情報は出てくれません.こういうときはどのデータを処理していて、どのテンプレートから呼び出したかがわからないので非常に解析に苦労します.

Saxonのドキュメントを見てみたのですが、JAXPでSaxonに設定できるフューチャーの中でコールトレースを出してくれるようなものはどうも見つかりませんでした.

Configuration Features

しかし、これはSaxonをjavaタスクで起動した場合のパラメータに -t オプションをつければ解決します.

<property name="transformer.classname" value="net.sf.saxon.Transform"/>
<makeurl property="dita.input.dir.url" file="${dita.input.dirname}"/>
<java classname="${transformer.classname}" classpathref="project.class.path" failonerror="true">
    <arg line='-t'/>
    <arg line='-o:"${prmOutputFile}"'/>
    <arg line='-s:"${prmInputFile}"'/>
    <arg line='-xsl:"${prmXslFile}"'/>
    ...
</java>

出てくるコールトレースは例えば以下のようなものです.

     [java] Error on line 780 of dita2fo_cover_print.xsl:
     [java]   XTTE0590: An empty sequence is not allowed as the value of parameter $prmTopicRef
     [java]   at xsl:apply-templates (file:/D:/DITA-OT1.7.5/plugins/pdf5/xsl/dita2fo_bodyelements.xsl#544)
     [java]      processing /dita-merge/bookmap[1]/bookmeta[1]/prodinfo[1]/component[1]/keyword[1]/text[1]
     [java]   at xsl:apply-templates (file:/D:/DITA-OT1.7.5/plugins/pdf5/xsl/dita2fo_metadataelements.xsl#64)
     [java]      processing /dita-merge/bookmap[1]/bookmeta[1]/prodinfo[1]/component[1]/keyword[1]
     [java]   at xsl:apply-templates (file:/D:/DITA-OT1.7.5/plugins/pdf5/xsl/dita2fo_cover.xsl#120)
     [java]      processing /dita-merge/bookmap[1]/bookmeta[1]/prodinfo[1]/component[1]
     [java]   at xsl:call-template name="genCover" (file:/D:/DITA-OT1.7.5/plugins/pdf5/xsl/dita2fo_main.xsl#51)
     [java] Transformation failed: Run-time errors were reported

これでどのデータを処理していたかも、どのテンプレートを経由して該当箇所にたどり着いたかがわかります.これでやっと安心してデバッグできます.

また-tの代わりに-Tとすれば、処理の最初からのすべてのテンプレートのコールトレースが出てくれます.これは最後の最後の頼みの綱です.

という訳で、私はプラグインbuild.xmlにはJAXPでSaxonを呼び出すターゲットとjavaタスクでSaxonを呼び出すターゲットを2つ置き、通常はJAXPで運用してもらい、何らかの不具合が出た場合にjavaタスクの呼び出しに切り替えてデバッグするという方法をとっています.

もしかしたらもっと良い方法があるのかもしれませんが参考になれば幸いです.