开发者

XSL Transform cannot invoke user defined Java Method

I have the following XSL which defines a namespace for my Java Class. In a nutshell I'm trying to point to a different resource bundle depending upon a value in my XML file (I know Resource Bundles are really for internationaliza开发者_运维知识库tion but why re-create the wheel?):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:java="http://xml.apache.org/xalan/java"
                xmlns:pf="my.package.common.PropertiesFinder">

    <xsl:variable name="compType" select="//comp_type"/>
    <xsl:variable name="props" select="pf:getPropsFile($compType)"/>
    <xsl:variable name="DEF6Resources" select="java:util.ResourceBundle.getBundle($props)"/>

When the transform runs I get the following error:

java.lang.NoSuchMethodException: For extension function, could not find method org.apache.xml.utils.NodeVector.getProps([ExpressionContext,])

Can anyone shed any light on why this is happening please. It's clearly something to do with my classpath/loader but I'm not sure what to do...

Many thanks in advance.

Anna


You have to check your namespace definition.

xmlns:pf="my.package.common.PropertiesFinder"

When you are defining a namespace for a Java class, you have to prepend it with the java: prefix.

xmlns:pf="java:my.package.common.PropertiesFinder"

Also, the method invoked (getPropsFile) must be declared as static.

And, I think that at this block of code:

<xsl:variable name="DEF6Resources" select="java:util.ResourceBundle.getBundle($props)"/>

You are missing the java root package:

<xsl:variable name="DEF6Resources" select="java:java.util.ResourceBundle.getBundle($props)"/>

(I'm not sure of this last, maybe the Xalan parser prepends it for some cases?)


Got same problem.

Finally I found that Xalan is unable to load classes with static blocks or static variables, or something like that. Maybe PropertiesFinder or ResourceBundle use static blocks internally. The error message was really misleading...

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜