Java / XSLT: no se puede encontrar una función de 1 argumento coincidente
Pregunta
Me sale el siguiente error:
javax.servlet.ServletException: Cannot find a matching 1-argument function named {http://exslt.org/dynamic}evaluate()
at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:841)
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:774)
La parte superior de mi archivo xslt es
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:dyn="http://exslt.org/dynamic"
extension-element-prefixes="dyn">
¿Sabes por qué puedo recibir este error?
UPDATE
Ahora se lee la parte superior de mi archivo XML.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:xalan="http://xml.apache.org/xalan"
exclude-result-prefixes="xalan">
y el XML donde estamos fallando es
<xsl:template name="test">
<xsl:param name="param" />
<xsl:value-of select="$param"/>
<xsl:value-of select="xalan:evaluate($param)"/>
</xsl:template>
Este código funciona en un servidor que ejecuta Tomcat 5.0 pero no funciona en un servidor que ejecuta Tomcat 5.5. Me imagino porque el código funciona en un servidor y no es un problema ambiental.
El XSLT se aplica al XML a través de una página JSP. Para mí, parece que el archivo xalan.jar no se está utilizando. La parte superior de la JSP es:
<%@page import="javax.xml.transform.*"%>
<%@page import="javax.xml.transform.stream.*"%>
<%@page import=" java.security.Principal,
java.net.URL,
java.net.URLConnection,
java.io.InputStream,
java.io.InputStreamReader,
java.io.Reader,
java.io.BufferedReader,
java.io.File,
javax.xml.transform.*,
javax.xml.transform.stream.*,
javax.xml.transform.*,
javax.xml.transform.stream.*"%>
Actualizar El problema es que Saxon está siendo elegido como el analizador XML. Saxon no es compatible con esta funcionalidad. Eliminar el Saxon.jar soluciona el problema.
Solución
En algún lugar de tu XSLT te refieres a una función llamada " { http://exslt.org/dynamic } evalúa () " y no le está dando la cantidad de argumentos que espera.
O ... no puede encontrar las extensiones que está agregando.
Otros consejos
Es probable que esté utilizando una versión anterior de Xalan .
Intente utilizar xalan: Evaluation ()
extensión.
Lea más sobre esto en este hilo .