我有以下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,])
任何人都可以解释为什么会发生这种情况。这显然与我的类路径/加载器有关,但我不知道该怎么做......
非常感谢提前。
安娜
答案 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无法使用静态块或静态变量加载类,或类似的东西。
也许PropertiesFinder
或ResourceBundle
在内部使用静态块。
错误信息确实具有误导性......