J'utilise Xalan 2.7.0 (fourni avec Apache FOP 1.0) et j'ai des problèmes lors de l'utilisation des fonctions de chaîne.Fonctions de chaînes manquant dans Xalan 2.7, java.lang.String utilisé à la place?
La ligne <xsl:value-of select="fn:replace('test', 't', '*')"/>
résultats à cette exception:
javax.xml.transform.TransformerException: java.lang.IllegalArgumentException: argument type mismatch
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
<xsl:value-of select="fn:string-length('foobar')"/>
résultats dans:
javax.xml.transform.TransformerException: java.lang.NoSuchMethodException: For extension function, could not find method java.lang.String.stringLength([ExpressionContext,]).
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
Maintenant, c'est bizarre! Pourquoi Xalan recherche-t-il une fonction stringLength
au java.lang.String
? J'ai testé <xsl:value-of select="fn:substring('foobar', 2, 3)"/>
, et en effet: le résultat est o
, donc les arguments ont été utilisés comme startIndex, endIndex
(comme java.lang.String.substring()
) au lieu de foncion XPath fn:substring(string, start, length)
. Donc je pense que Xalan manque d'une manière ou d'une autre sa bibliothèque de fonctions XPath et utilise la classe String normale à la place. Je l'ai confirmé en appelant la fonction non existante fn:index-of('foobar', 'bar')
qui fonctionne bien et mappe à java.lang.String.indexOf(str)
.
Pourquoi Xalan fait-il cela? Et comment puis-je le réparer? Informations système: Xalan utilise la version Java standard de Mac OS X 10.6.4, 1.6.0_20.
Mise à jour
Bon, laisser de côté la fonction replace()
pour un moment. Xalan ne devrait-il pas, étant un processeur XSLT 1.0, implémenter le XPath 1.0 function substring(string, startIndex, length)
et non la fonction (string, startIndex, endIndex)
que je vois dans mes expirations? Est-ce une coïncidence que cette fonction startIndex, endIndex ressemble à la méthode de sous-chaîne de java.lang.String
?
Et pourquoi ai-je une erreur NoSuchMethodError lorsque j'utilise la fonction fn:string-length
?
Quelque chose ne va pas ici, et clairement à propos XPath 1.0 n `vs 2.0 ...
Bonne question (1). Voir ma réponse pour l'explication. –
Quel espace de noms utilisez-vous pour le préfixe fn:? Lorsque vous utilisez ' ' (c'est-à-dire pas de préfixe d'espace de noms sur 'string-length()'), cela donne-t-il encore une exception NoSuchMethodException? –
LarsH
LarsH: L'espace de nom est http://www.w3.org/2005/02/xpath-functions, mais comme Alejandro l'écrit ci-dessous, je dois omettre le préfixe fn:. Merci! –