2011-10-06 41 views
5

Estoy ejecutando una transformación XSLT desde dentro de mi aplicación web Java sin problemas, de la siguiente manera:Ejecutar XSLT de transformación de Java con parámetros

Transformer transformer = TransformerFactory.newInstance().newTransformer(xslSource); 
transformer.transform(xmlInput, xmlOutput); 

En mi transformación XSLT ahora estoy añadiendo una llamada a la función document() para cargar la respuesta de un servicio web REST:

<!-- do stuff --> 
<xsl:variable name="url"> 
    http://server/service?id=<xsl:value-of select="@id"/> 
</xsl:variable> 
<xsl:call-template name="doMoreStuff"> 
    <xsl:with-param name="param1" select="document($url)/foo"/> 
</xsl:call-template> 

fresco Ok, no hay problema. Pero ahora, quiero leer la URL base de una clase utils en java y pasarla a la hoja de estilos.

//java 
String baseUrl = myUtils.getBaseUrl(); 

<!-- xslt --> 
<xsl:variable name="url"> 
    <xsl:value-of select="$baseUrl"/> 
    <xsl:text>/service?id=</xsl:text> 
    <xsl:value-of select="@id"/> 
</xsl:variable> 

¿Alguna sugerencia de cómo hacer esto? Mi clase Java utils carga el valor de un archivo myApp.properties en classpath, pero no estoy seguro de que pueda utilizarlo de XSLT ...

Respuesta

6

Declare una xsl:param en su hoja de estilos, por lo que el valor baseUrl se puede transmitir en tiempo de invocación:

<xsl:param name="baseUrl" /> 

Ajuste el parámetro en la Transformer objeto:

Transformer transformer = TransformerFactory.newInstance().newTransformer(xslSource); 
transformer.setParameter('baseUrl', myUtils.getBaseUrl()); 
transformer.transform(xmlInput, xmlOutput); 

Si está utilizando XSLT 2.0, entonces se puede considerar utilizando la función resolve-uri() cuando se está construyendo la url valor de la variable:

<xsl:variable name="url" 
       select="resolve-uri(concat('/service?id=', @id), $baseUrl)" /> 

resolve-uri() puede ayudar a compensar la barra final, hashtags, y otras cosas en el baseUrl que de otro modo podrían resultar una URL no válida que se construirá por simplemente concatenando el $baseUrl con el fragmento y @id.

+0

Es importante tener en cuenta que '' debe declararse en el nivel superior de la hoja de estilo. Si lo declaras dentro de una plantilla, se considerará un parámetro para la plantilla, no para toda la hoja de estilo. – karl

6

Llame a setParameter en su instancia de Transformer, con el nombre y el valor de su parámetro. A continuación, dentro de su documento XSLT declarar el parámetro con <xsl:param name="yourParamName" /> y luego se puede utilizar en su XSLT, por ejemplo, de esta manera: <xsl:value-of select="$yourParamName" />