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 Chris Bare <a-...@expedia.com> on 2005/10/19 21:47:54 UTC

Problem calling external java method

Help!

I keep getting a NoSuchMethodException while trying to call a java
extention function using Xalan-j 2.7.0. It seems that calling static
java methods works, but calling nonstatic methods seems to be broken.

I've included an easy way to reproduce the problem here. The commented
out template calls a static function on the class Helper. It works. The
other template calls a nonstatic method and it barfs giving this
message:
NoSuchMethodException: For extension function, could not find method
static xsltest.Helper.square([ExpressionContext,] #UNKNOWN
(xsltest.Helper), #NODESET)

Maybe I'm doing something wrong. I'm trying to follow the instructions
here:
http://xml.apache.org/xalan-j/extensions_xsltc.html

My questions are:
  Am I doing something totally bass-ackwards?
  Is this a Xalan bug?
  Is there already a bug report filed?
  (I looked in Jira and found old closed bugs [Bug 1501], but none for
2.7.0.)



-- test.xsl ----------------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:java="http://xml.apache.org/xalan/java"
				version="1.0">

	<xsl:output method="xml"/>
        <xsl:variable name="helper" select="java:xsltest.Helper.new()"/>

	<xsl:template match="/">
	  <foobar>
	    <xsl:apply-templates select="/xsltest"/>
	  </foobar>
	</xsl:template>

	<xsl:template match="number">
	  <number>
	    <xsl:variable name="num" select="@value"/>
	    <xsl:attribute name="square"><xsl:value-of
select="java:xsltest.Helper.square($helper,$num)"/></xsl:attribute>
	  </number>
	</xsl:template>

<!-- 
	<xsl:template match="number">
	  <number>
	    <xsl:variable name="num" select="@value"/>
	    <xsl:attribute name="square"><xsl:value-of
select="java:xsltest.Helper.staticSquare($num)"/></xsl:attribute>
	  </number>
	</xsl:template>
-->

</xsl:stylesheet>


-- Helper.java -------------------------------------------------

package xsltest;

public class Helper {

    public static int staticSquare(int n) {
        return n * n;
    }

    public int square(int n) {
        return n * n;
    }
}

-- MyXml.xml ---------------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<xsltest>
	<number value="3"/>
	<number value="17"/>
</xsltest>



Here's the command line:

> java -cp
./classes;./lib/xml-apis.jar;./lib/serializer.jar;./lib/xercesImpl.jar;.
/lib/xalan.jar;./lib/log4j-1.2.12.jar
org.apache.xalan.xslt.Process -IN ./src/xsltest/MyXml.xml -XSL
./src/xsltest/test.xsl

Here's the error msg:

(Location of error unknown)XSLT Error
(javax.xml.transform.TransformerException):
java.lang.NoSuchMethodException: For extension function, could not find
method static xsltest.Helper.square([ExpressionContext,] #UNKNOWN
(xsltest.Helper), #NODESET).
Exception in thread "main" java.lang.RuntimeException:
java.lang.NoSuchMethodException: For extension function, could not find
method static xsltest.Helper.square([ExpressionContext,] #UNKNOWN
(xsltest.Helper), #NODESET).
        at org.apache.xalan.xslt.Process.doExit(Process.java:1153)
        at org.apache.xalan.xslt.Process.main(Process.java:1126)


org.apache.xalan.xslt.EnvironmentCheck gives me:

[...]
version.xerces2=Xerces-J 2.7.1
version.xerces1=not-present
version.xalan2_2=Xalan Java 2.7.0
version.xalan1=not-present
version.ant=not-present
java.version=1.5.0_05
version.DOM=2.0
version.crimson=not-present
[...]
version.SAX=2.0
version.xalan2x=Xalan Java 2.7.0
[...]



-- thanks!!!

Re: Problem calling external java method

Posted by John Gentilin <ge...@eyecatching.com>.
Chris,

I declare my extensions, in interpretive mode, a bit differently. I 
think the java namespace may
have special meaning. The example below declares a class called 
CategoryPageMgr that exists
in the custom package.

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:catmgr="custom.CategoryPageMgr"
    exclude-result-prefixes="catmgr"
    extension-element-prefixes="catmgr">

    <xsl:param name="CategoryMgr" select="catmgr:new()"/>
   
    <xsl:template match="foo">
       <data>
           <xsl:value-of select="catmgr:getCategoryPage($CategoryMgr, 
$category, $localID, $pageData)" />                   
       </data>
    </xsl:template>

</xsl:stylesheet>

Hope that helps
John G

Chris Bare wrote:

>Help!
>
>I keep getting a NoSuchMethodException while trying to call a java
>extention function using Xalan-j 2.7.0. It seems that calling static
>java methods works, but calling nonstatic methods seems to be broken.
>
>I've included an easy way to reproduce the problem here. The commented
>out template calls a static function on the class Helper. It works. The
>other template calls a nonstatic method and it barfs giving this
>message:
>NoSuchMethodException: For extension function, could not find method
>static xsltest.Helper.square([ExpressionContext,] #UNKNOWN
>(xsltest.Helper), #NODESET)
>
>Maybe I'm doing something wrong. I'm trying to follow the instructions
>here:
>http://xml.apache.org/xalan-j/extensions_xsltc.html
>
>My questions are:
>  Am I doing something totally bass-ackwards?
>  Is this a Xalan bug?
>  Is there already a bug report filed?
>  (I looked in Jira and found old closed bugs [Bug 1501], but none for
>2.7.0.)
>
>
>
>-- test.xsl ----------------------------------------------------
>
><?xml version="1.0" encoding="UTF-8"?>
><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>                xmlns:java="http://xml.apache.org/xalan/java"
>				version="1.0">
>
>	<xsl:output method="xml"/>
>        <xsl:variable name="helper" select="java:xsltest.Helper.new()"/>
>
>	<xsl:template match="/">
>	  <foobar>
>	    <xsl:apply-templates select="/xsltest"/>
>	  </foobar>
>	</xsl:template>
>
>	<xsl:template match="number">
>	  <number>
>	    <xsl:variable name="num" select="@value"/>
>	    <xsl:attribute name="square"><xsl:value-of
>select="java:xsltest.Helper.square($helper,$num)"/></xsl:attribute>
>	  </number>
>	</xsl:template>
>
><!-- 
>	<xsl:template match="number">
>	  <number>
>	    <xsl:variable name="num" select="@value"/>
>	    <xsl:attribute name="square"><xsl:value-of
>select="java:xsltest.Helper.staticSquare($num)"/></xsl:attribute>
>	  </number>
>	</xsl:template>
>-->
>
></xsl:stylesheet>
>
>
>-- Helper.java -------------------------------------------------
>
>package xsltest;
>
>public class Helper {
>
>    public static int staticSquare(int n) {
>        return n * n;
>    }
>
>    public int square(int n) {
>        return n * n;
>    }
>}
>
>-- MyXml.xml ---------------------------------------------------
>
><?xml version="1.0" encoding="UTF-8"?>
><xsltest>
>	<number value="3"/>
>	<number value="17"/>
></xsltest>
>
>
>
>Here's the command line:
>
>  
>
>>java -cp
>>    
>>
>./classes;./lib/xml-apis.jar;./lib/serializer.jar;./lib/xercesImpl.jar;.
>/lib/xalan.jar;./lib/log4j-1.2.12.jar
>org.apache.xalan.xslt.Process -IN ./src/xsltest/MyXml.xml -XSL
>./src/xsltest/test.xsl
>
>Here's the error msg:
>
>(Location of error unknown)XSLT Error
>(javax.xml.transform.TransformerException):
>java.lang.NoSuchMethodException: For extension function, could not find
>method static xsltest.Helper.square([ExpressionContext,] #UNKNOWN
>(xsltest.Helper), #NODESET).
>Exception in thread "main" java.lang.RuntimeException:
>java.lang.NoSuchMethodException: For extension function, could not find
>method static xsltest.Helper.square([ExpressionContext,] #UNKNOWN
>(xsltest.Helper), #NODESET).
>        at org.apache.xalan.xslt.Process.doExit(Process.java:1153)
>        at org.apache.xalan.xslt.Process.main(Process.java:1126)
>
>
>org.apache.xalan.xslt.EnvironmentCheck gives me:
>
>[...]
>version.xerces2=Xerces-J 2.7.1
>version.xerces1=not-present
>version.xalan2_2=Xalan Java 2.7.0
>version.xalan1=not-present
>version.ant=not-present
>java.version=1.5.0_05
>version.DOM=2.0
>version.crimson=not-present
>[...]
>version.SAX=2.0
>version.xalan2x=Xalan Java 2.7.0
>[...]
>
>
>
>-- thanks!!!
>  
>


-- 
--------------------------------------
John Gentilin
Eye Catching Solutions Inc.
18314 Carlwyn Drive
Castro Valley CA 94546

    Contact Info
gentijo@eyecatching.com
Ca Office 1-510-881-4821
NJ Office 1-732-422-4917