XSL Transform не может вызвать пользовательский метод Java - PullRequest
2 голосов
/ 26 октября 2010

У меня есть следующий 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,])

Может кто-нибудь пролить свет на то, почему это происходит, пожалуйста. Это явно связано с моим classpath / loader, но я не уверен, что делать ...

Большое спасибо заранее.

Anna

Ответы [ 2 ]

1 голос
/ 26 октября 2010

Вы должны проверить определение своего пространства имен.

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 предваряет его в некоторых случаях?)

0 голосов
/ 27 июля 2012

У меня такая же проблема.

Наконец я обнаружил, что Xalan не может загружать классы со статическими блоками или статическими переменными, или что-то в этом роде.Возможно PropertiesFinder или ResourceBundle использовать статические блоки внутри.Сообщение об ошибке действительно вводило в заблуждение ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...