XSL Transform无法调用用户定义的Java方法

时间:2010-10-26 10:50:46

标签: java xalan xslt

我有以下XSL,它定义了我的Java类的命名空间。简而言之,我试图根据我的XML文件中的值来指向不同的资源包(我知道资源包实际上是用于国际化,但为什么要重新创建轮子?):

<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)"/>

转换运行时出现以下错误:

java.lang.NoSuchMethodException:对于扩展函数,找不到方法org.apache.xml.utils.NodeVector.getProps([ExpressionContext,])

任何人都可以解释为什么会发生这种情况。这显然与我的类路径/加载器有关,但我不知道该怎么做......

非常感谢提前。

安娜

2 个答案:

答案 0 :(得分:1)

您必须检查命名空间定义。

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

在为Java类定义命名空间时,必须在前面添加java:前缀。

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

此外,调用的方法(getPropsFile)必须声明为static

而且,我认为在这段代码中:

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

您缺少java root包:

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

(我最后不确定,也许Xalan解析器会在某些情况下预先设置它?)

答案 1 :(得分:0)

遇到同样的问题。

最后我发现Xalan无法使用静态块或静态变量加载类,或类似的东西。 也许PropertiesFinderResourceBundle在内部使用静态块。 错误信息确实具有误导性......