You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-users@xalan.apache.org by Will Milspec <wi...@gmail.com> on 2010/08/04 17:39:34 UTC

Re: extensions problem

Hi all,

SOLVED: As a follow-up to my earlier email "extension problem", I've found
the cause of said problem: how ant 1.8 uses the "xslt" task's 'classpathref'
attribute  to load extension classes.

To recap:
============
* our ant build script used the xslt task to process xml files
* the xsl file used xalan's extension mechanism to call a custom class to
write out unicode characters to the output file
* in ant 1.7, the combination of build.xml and .xsl worked fine
* in ant 1.8.0 ant 1.8.1, xalan threw this exception:

    [xslt] /home/myhome/projects/pe_
mainline4/pe/src/xsl/literals/gen_java.xsl:84:41: Fatal Error!
java.lang.NoSuchMethodException: For extension function, could not find
method
org.apache.xml.dtm.ref.DTMNodeIterator.formatUnicode([ExpressionContext,] ).
Cause: java.lang.NoSuchMethodException: For extension function, could not
find method
org.apache.xml.dtm.ref.DTMNodeIterator.formatUnicode([ExpressionContext,] ).


Cause:
==========
It turns out:
-Ant 1.7 uses the 'classpathref' attribute of the 'xslt' style task to load
the custom/extension class
-Ant 1.8 does not use 'classpathref' in the same way. Xalan could not load
the custom class , even though our build.xml had the value for
'classpathref'

I could toggle off/on 'NoSuchMethod' error by calling the xalan.xslt.Process
from the command line and adding/not-adding the path-to-my-extension-class
to my classpath.

Workaround
===========
I haven't analyzed the ant code yet to find/fix/grok the 1.8 changes which
caused the change, but have the following workaround:

* I compiled-and-jarred the 'unicode utility' class and put the .jar file in
$ANT_HOME/lib. The XSLT task correctly found the 'extension' class

* I looked into calling the xalan.xslt.Process class directly (i.e. with the
-IN,-OUT,etc. arguments) and explicitly setting the classpath, but need the
ability to process multiple files 'in one shot'.


Ant build.xml fragment
============
   <xslt basedir="${literals.dir}/xml"
          extension=".log"
          destdir="${literals.dir}"
          style="${literals.xsl.dir}/gen_java.xsl"
          includes="*.xml"
          classpathref="build.classpath"  <--Build.classpath pointed to
classpath that included our compiled classes
          >

xslt fragment
==================
<xsl:stylesheet version="1.0" xmlns:xsl="
http://www.w3.org/1999/XSL/Transform"
   xmlns:redirect="http://xml.apache.org/xalan/redirect"
   xmlns:escape="xalan://com.mycompany.util.xml.UnicodeEncodeUtil"
   extension-element-prefixes="redirect escape"
   >

Hope this helps someone

will