2011-10-06 9 views
5

sto eseguendo una trasformazione XSLT da dentro il mio applicazioni Web Java senza problemi, come segue:Esegui XSLT Transform da Java con il parametro

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

Nella mia trasformazione XSLT ora sto Aggiunta di una chiamata alla funzione document() per caricare la risposta da un servizio web RESTful:

<!-- 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> 

Ok, non c'è problema. Ma ora, voglio leggere l'URL di base da una classe utils in java e passarlo al foglio di stile.

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

Qualche suggerimento su come farlo? La mia classe Java utils carica il valore da un file myApp.properties sul classpath, ma non sono sicuro di poterlo utilizzare da XSLT ...

risposta

6

dichiarare un xsl:param nel foglio di stile, in modo che il valore baseUrl può essere passato al momento invocazione:

<xsl:param name="baseUrl" /> 

Impostare il parametro sull'oggetto Transformer:

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

Se si sta utilizzando XSLT 2.0, allora si può prendere in considerazione utilizzando la funzione di resolve-uri() quando si sta costruendo il url valore della variabile:

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

resolve-uri() può contribuire a compensare trailing slash, hashtag, e altre cose del baseUrl che potrebbero altrimenti derivare un URL non valido da costruire da semplicemente concatenando $baseUrl con il frammento e @id.

+0

Importante notare che '' deve essere dichiarato al livello superiore del foglio di stile. Se lo si dichiara all'interno di un modello, verrà considerato un parametro per il modello non per l'intero foglio di stile. – karl

6

Chiama setParameter nell'istanza di Transformer, con il nome e il valore del tuo parametro. Poi all'interno del documento XSLT dichiarare il parametro utilizzando <xsl:param name="yourParamName" /> e si può quindi utilizzare nel vostro XSLT ad esempio in questo modo: <xsl:value-of select="$yourParamName" />