Appel Java les méthodes d'instance dans XSLT
Je suis en utilisant Saxon (je pourrais utiliser Xalan si nécessaire) processeur XSLT de faire quelques de transformation.
Je veux passer l'instance de l'objet ci-dessous pour la XSLT modèle en tant que paramètre.
public class Test {
private String value;
public Test(String v) {
value = v;
}
//getters, setters etc.
}
Donc j'ai créer cet objet, c'est à dire.
Test test = new Test("test");
transformer.setParameter("test", test);
Dans le fichier XSLT je déclare le param:
<xsl:param name="test" required="yes" as="jt:com.whatever.package.Test" xmlns:jt="http://saxon.sf.net/java-type"/>
Maintenant, ma question est comment puis-je appeler toute méthode d'instance (ie. getValue() ) sur cet objet dans XSLT? Est-il même possible? Je sais que je peux appeler des méthodes statiques de différentes classes Java, mais ce n'est pas exactement ce que je cherche.
Aussi, est-il possible d'alimenter des objets Java dans XSLT, c'est à dire. appel des méthodes de définition pour une instance d'un objet et ensuite utiliser cet objet avec de nouvelles valeurs dans le code Java après la transformation est terminée?
Je suis en utilisant Saxon 9. merci
"Exactement" est ici essentielle. La réponse de Saxon-B 9.1 n'est pas la même que pour le Saxon-IL 9.4, par exemple.
OriginalL'auteur Zyga | 2012-10-06
Vous devez vous connecter pour publier un commentaire.
Vous devriez être en mesure d'appeler les méthodes d'instance d'un "objet externe" transmis en tant que paramètre dans la façon dont vous décrivez. Si $objet est un objet, et com.package.Maclasse est sa classe, et que vous voulez appeler la méthode getColor sur cet objet, puis
(a) vous devez déclarer un espace de noms, tels que xmlns:MyClass="java:com.package.MyClass"
(b) vous appelez la méthode MyClass:getColor($objet)
Ce mécanisme pour appeler à l'Java est appelé dans le Saxon "réflexive fonctions d'extension". Il n'est pas pris en charge dans le Saxon Maison d'Édition. Vous aurez besoin d'Saxons Professionnel de l'Édition, ou la vieille open-source Saxon-B produit. Il y a un autre mécanisme de Saxon-IL appelé "intégré des fonctions d'extension", mais il nécessite un peu plus de codage sur le Java côté de déclarer le type des arguments et du résultat.
Vous devez être conscient du fait qu'avec réflexive fonctions d'extension, Saxon est de faire des hypothèses quant à la façon de carte Java types de XPath types, et il ne permet pas toujours de faire la cartographie de la façon dont vous voulez, en particulier lors de l'utilisation de types de collection.
Essayez d'éviter d'utiliser des méthodes avec les effets secondaires, tels que des méthodes de définition. Il n'y a absolument aucun moyen fiable de s'assurer, dans le Saxon que de tels appels sont exécutés dans un ordre particulier, et parfois le Saxon optimiseur de trouver un moyen de l'organisation de la requête qui évite de faire appel à tous. Si vous devez faire de tels appels, de les traiter comme si l'appel ont été retournant un résultat (comme une séquence vide) et l'utilisation de l'appel de telle manière que si c'était le retour d'un résultat, le résultat apparaît dans votre feuille de style de sortie.
OriginalL'auteur Michael Kay
C'est bien expliqué ici:
http://www.saxonica.com/html/documentation/extensibility/functions/
Un court exemple:
lorsqu'il est appliqué sur n'importe quel document XML (non utilisé) produit le voulait, résultat correct:
extension-element-prefixes="date"
àxsl:stylesheet
si vous n'obtenez pas lexmlns:date="java:java.util.Date"
dans la sortie.Alors que l'extension-element-prefixes va avoir un effet, c'est le mauvais outil pour le travail: l'attribut correct à utiliser est exclude-result-prefixes.
OriginalL'auteur Dimitre Novatchev
Je l'ai fait il y a longtemps à l'aide de Xalan. Tout d'abord, vous devez ajouter les lignes suivantes à votre xslt (je ne pense pas que vous avez besoin de tous les autres attributs que vous mettez)
et puis, pour appeler la méthode, vous pouvez faire
J'ai essayé de le faire avec Xalan, mais il dit: "préfixe d'espace de Noms 'test' est non déclaré.'
OriginalL'auteur Augusto
C'est trop tard je suis annonce mais pour quelqu'un d'autre, il peut être utile.
Que vous pouvez facilement réaliser avec l'aide de xalan processeur:
Étape 1: inclure la Xalan de dépendance ou adapté pot impliqués
L'étape 2. Choisissez ce processeur lors de l'intégration avec java
L'étape 3. Dans votre xsl entrez les informations dans la feuille de style
Veuillez noter que cette classe doit être la méthode Statique que vous allez utiliser dans le xslt
Étape 4 : utiliser dans votre xslt
Il peut être de chaîne ou de numéro..en fonction de votre méthode argument
Source: http://www.cafeconleche.org/books/xmljava/chapters/ch17s03.html
OriginalL'auteur hiccup