Вызов функции Java через XSLT в JBoss вызывает исключение преобразователя (работает в tomcat)
У меня есть открытая статическая функция аргумента 0 в Java, которую я пытаюсь вызвать через 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 (который используется в некоторых частях этого веб-приложения) может иметь проблемы с совместимостью с такими вещами. Есть ли способ сказать, что он использует / заставить его использовать другой? Извиняюсь, если я пропустил некоторую важную информацию здесь, это не моя область знаний - дайте мне знать, если нужна какая-то другая информация.
редактировать: чтобы показать, как это используется, вот код
<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 ответа
Кажется, что вам нужно использовать "xalan://" вместо "java:" для объявления пространства имен java, поэтому
<xmlns:rclass="xalan://com.example.MyClass">
в этом случае. Я не уверен, почему это сработало на Tomcat, а не на JBoss, но, возможно, они подбирали разные версии ксаланской банки.
Вы правы в том, что при обращении к Java существуют различия между Xalan и Saxon; На первый взгляд мне кажется, что ваша таблица стилей предназначена для работы с Saxon, но на самом деле она работает под управлением Xalan. Вы можете узнать, какой продукт на самом деле используется, вызвав системное свойство ('xsl:vendor') из любого выражения XPath.