2009-01-15 70 views
5

Estoy pasando un conjunto de pares clave-valor como parámetros a un XSL (fecha -> "20 de enero", autor -> "Dominic Rodger", ...).Variables dinámicas en XSLT

éstos están mencionados en alguna XML Estoy análisis - el XML tiene el siguiente aspecto:

<element datasource="date" /> 

En la actualidad, no puedo encontrar la manera de llegar 20ma de enero de salir de ellos, excepto con una terrible <xsl:choose> declaración:

<xsl:template match="element"> 
    <xsl:choose> 
    <xsl:when test="@datasource = 'author'"> 
     <xsl:value-of select="$author" /> 
    </xsl:when> 
    <xsl:when test="@datasource = 'date'"> 
     <xsl:value-of select="$date" /> 
    </xsl:when> 
    ... 
    </xsl:choose> 
</xsl:template> 

me gustaría usar algo como:

<xsl:template match="element"> 
    <xsl:value-of select="${@datasource}" /> 
</xsl:template> 

Pero sospecho que esto no es posible. Estoy empezando a usar llamadas a funciones externas, pero quiero evitar tener que enumerar todas las claves de mapa posibles en mi XSL. ¿Algunas ideas?

Gracias,

Dom

+0

Por favor, tenga en cuenta que a partir de las tres respuestas presentados, dos no son correctos - no es un operador "+" para cuerdas en XPath, y también, un AVT no se puede especificar para un "seleccionar" atributo en XSLT. Mi solución está probada y funciona. –

Respuesta

2

Aquí es una solución posible, sin embargo, me gustaría recomendar la agrupación de todos los parámetros en un archivo XML independiente y acceder a ellos con la función document():

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" 
exclude-result-prefixes="ext" 
> 
<xsl:output method="text"/> 

<xsl:param name="date" select="'01-15-2009'"/> 
<xsl:param name="author" select="'Dominic Rodger'"/> 
<xsl:param name="place" select="'Hawaii'"/> 
<xsl:param name="time" select="'midnight'"/> 

<xsl:variable name="vrtfParams"> 
    <date><xsl:value-of select="$date"/></date> 
    <author><xsl:value-of select="$author"/></author> 
    <place><xsl:value-of select="$place"/></place> 
    <time><xsl:value-of select="$time"/></time> 
</xsl:variable> 

<xsl:variable name="vParams" select="ext:node-set($vrtfParams)"/> 

    <xsl:template match="element"> 
     <xsl:value-of select= 
     "concat('&#xA;', @datasource, ' = ', 
       $vParams/*[name() = current()/@datasource] 
       )" 
     /> 
    </xsl:template> 
</xsl:stylesheet> 

Cuando se aplica esta transformación en la siguiente XML documento:

<data> 
    <element datasource="date" /> 
    <element datasource="place" /> 
</data> 

el resultado correcto se produce:

fecha = 01-15-2009

lugar = Hawai

hacer la nota el uso de la función xxx:node-set() (the EXSLT one se utiliza aquí) para convertir un archivo RTF (Result Tree Fragment) a un documento XML regular (temporal árbol).

-2

¿Qué tal

<xsl:template match="date-element"> 
    <xsl:text>${date}</xsl:text> 
</xsl:template> 

es decir, en lugar de utilizar un atributo, partido utilizando diferentes nombres de los elementos.

Si no puede cambiar el código fuente XML, ejecútelo a través de un pequeño XSLT que convierta los atributos a los nombres correctos de los elementos.

Una solución diferente sería poner los elementos xsl: param en un documento XML diferente (o intentar hacer que la plantilla XSLT se lea de nuevo). Luego puede usar xsl: key y key() para referenciarlos.

[EDITAR] Sustituido xsl: valor-de con xsl: texto. No tengo una utilidad XSLT a mano, así que no puedo probar esto. Por favor, publique un comentario si esto tampoco funciona.

+0

Lo sentimos, pero el atributo "Seleccionar" es el único para el que no se pueden especificar AVT (Atributo-valor-plantillas). –

0

Si su @datasource siempre coincide con el nombre del parámetro, puede probar la función "evaluar". Nota: este código no ha sido probado.

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:exslt-dynamic="http://exslt.org/dynamic" 
> 

<xsl:param name="date"/> 

<xsl:template match="element"> 
    <xsl:value-of select="exslt-dynamic:evaluate('$' + @datasource)"/> 
</xsl:template> 

</xsl:stylesheet> 
+1

No está probado, de hecho. En XPath, uno no puede sumar ('+') cadenas, esto nunca se compilará. –

Cuestiones relacionadas