2010-10-26 3 views
2

J'ai le XSL suivant qui définit un espace de noms pour ma classe Java. En un mot, je suis en train de pointer vers un ensemble de ressources différentes en fonction d'une valeur dans mon fichier XML (je sais ressources Bundles sont vraiment pour l'internationalisation, mais pourquoi recréer la roue?):La transformation XSL ne peut pas appeler la méthode Java définie par l'utilisateur

<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)"/> 

Lorsque la transformer runs je reçois l'erreur suivante:

java.lang.NoSuchMethodException: Pour la fonction d'extension, n'a pas pu trouver org.apache.xml.utils.NodeVector.getProps méthode ([ExpressionContext,])

quelqu'un peut-il apporter toute la lumière sur pourquoi cela se passe s'il vous plaît. C'est clairement quelque chose à voir avec mon classpath/loader mais je ne sais pas quoi faire ...

Merci beaucoup d'avance.

Anna

+0

Je ne sais pas pourquoi vous avez une balise "classnotfoundexception", mais le corps contient 'NoSuchMethodException' à la place. –

+0

Où se trouve le fichier jar contenant 'org.apache.xml.utils.NodeVector.getProps()'? Quel est le parcours de classe actuel pour autant que vous le sachiez? Comment passez-vous le classpath au processeur XSLT (que je suppose être Xalan)? Je tire dans l'obscurité, mais il est probable que les réponses à ces q nous aideront et que vous réduisiez le problème. – LarsH

Répondre

1

Vous devez vérifier la définition de votre espace de noms.

xmlns:pf="my.package.common.PropertiesFinder" 

Lorsque vous définissez un espace de noms pour une classe Java, vous devez le préfixer avec le préfixe java:.

xmlns:pf="java:my.package.common.PropertiesFinder" 

En outre, la méthode invoquée (getPropsFile) doit être déclarée comme static.

Et, je pense que ce bloc de code:

<xsl:variable name="DEF6Resources" select="java:util.ResourceBundle.getBundle($props)"/> 

Il vous manque le package racine java:

<xsl:variable name="DEF6Resources" select="java:java.util.ResourceBundle.getBundle($props)"/> 

(Je ne suis pas sûr de ce dernier, peut-être le Xalan l'analyseur le remplace dans certains cas?)

0

Vous avez le même problème.

Enfin, j'ai trouvé que Xalan est incapable de charger des classes avec des blocs statiques ou des variables statiques, ou quelque chose comme ça. Peut-être PropertiesFinder ou ResourceBundle utiliser des blocs statiques en interne. Le message d'erreur était vraiment trompeur ...

Questions connexes