在JBoss中通过XSLT调用Java函数会抛出变换器异常(在tomcat中工作)

时间:2012-03-14 10:09:08

标签: java xslt jboss saxon xalan

我在Java中有一个public static 0参数函数,我试图通过Web应用程序中的XSLT调用。当我在tomcat(5.5.34)中运行它时,它工作正常,但是当我在JBoss(6.1 final)中运行它时我得到了错误

TransformerException: Instance method call to method getScoreXMLTagClass requires an
Object instance as first argument

我想知道JBoss是否使用了不同的XSLT解析器 - 我相信我想使用Xalan,我听说Saxon(在这个webapp的某些部分中使用)可能与这种类型的兼容性问题事情。有没有办法告诉它正在使用/强制它使用另一个?如果我在这里错过了一些重要信息,请道歉,这不是我的专业领域 - 如果需要其他信息,请告诉我。

修改 为了说明如何使用它,这里是代码

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
...
xmlns:resources="java:com.example.MyResources"
<xmlns:rclass="java:com.example.MyClass">
    <xsl:template name="scoreString">
    <xsl:param name="string" />
    <xsl:value-of select="resources:getString(rclass:getData(),$string,null)"/>
</xsl:template>

<xsl:template match="/">
<xsl:if test="normalize-space(.)">
<div>
<xsl:for-each select="s:scores/s:score">
<xsl:for-each select="s:net">
<dl>
<dt>
    <xsl:call-template name="scoreString">
    <xsl:with-param name="string">network</xsl:with-param>
        </xsl:call-template>
    <xsl:value-of select="@id"/>
</dt>
...

我缩短了类名以简化它。等效错误是

TransformerException: Instance method call to method getData requires an
Object instance as first argument

编辑2

方法是

public static final Class getData()
{
    return MyClass.class;
}

2 个答案:

答案 0 :(得分:3)

您似乎需要使用'xalan://'而不是'java:'来声明java命名空间,所以

<xmlns:rclass="xalan://com.example.MyClass">

在这种情况下。我不确定为什么它适用于tomcat而不是JBoss,但是他们可能会选择不同版本的Xalan jar。

答案 1 :(得分:1)

你是对的,在呼唤Java时,Xalan和Saxon之间存在差异;乍一看,它看起来好像你的样式表设计与Saxon一起使用,但实际上是在Xalan下运行。您可以通过从任何XPath表达式调用system-property('xsl:vendor')来找出实际使用的产品。