2

我有以下 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,])

任何人都可以解释为什么会这样。这显然与我的类路径/加载器有关,但我不确定该怎么做......

提前谢谢了。

安娜

4

2 回答 2

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 根包:

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

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

于 2010-10-26T11:39:24.697 回答
0

遇到同样的问题。

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

于 2012-07-27T08:45:55.707 回答