Вызов функции Java через XSLT в JBoss вызывает исключение преобразователя (работает в tomcat) - PullRequest
3 голосов
/ 14 марта 2012

У меня есть открытая статическая функция аргумента 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 (который используется в некоторых частях этого веб-приложения) может иметь проблемы совместимости с подобными вещами.Есть ли способ сказать, что он использует / заставить его использовать другой?Извиняюсь, если я пропустил некоторую важную информацию здесь, это не моя область знаний - дайте мне знать, если нужна какая-то другая информация.

edit: Чтобы показать, как это используетсявот код

<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

edit 2

, метод

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

Ответы [ 2 ]

3 голосов
/ 15 марта 2012

Кажется, что вам нужно использовать 'xalan: //' вместо 'java:' для объявления пространства имен java, поэтому

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

в этом случае.Я не уверен, почему это сработало на Tomcat, а не на JBoss, но, возможно, они подбирали разные версии ксаланской банки.

1 голос
/ 14 марта 2012

Вы правы в том, что при обращении к Java существуют различия между Xalan и Saxon;На первый взгляд мне кажется, что ваша таблица стилей предназначена для работы с Saxon, но на самом деле она работает под управлением Xalan.Вы можете узнать, какой продукт на самом деле используется, вызвав системное свойство ('xsl: vendor') из любого выражения XPath.

...