2009-04-02 64 views
17

¿Puede alguien decirme cómo imprimir una variable en mi transformación XSL? Parece una cosa fácil de hacer, pero parece que no puedo hacerlo. Aquí está el código que tengo:Imprimir el valor de una variable XSL

<?xml version='1.0' encoding='UTF-8' ?> 
<xsl:stylesheet version="1.0" 
    xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template name="ControlledListStructure"> 
    <xsl:param name="xmlElem" /> 
    <xsl:param name="dataName" /> 

    <xsl:element name="{$xmlElem}"> 
     1: <xsl:text>{$xmlElem}</xsl:text>. 
     2: {$xmlElem}. 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

Si Llamé a esta plantilla con un valor para xmlElem de "Wibble" (una cadena - no es un nodo), me gustaría tener el siguiente resultado:

<Wibble> 
     1: {$xmlElem}. 
     2: {$xmlElem}. 
</Wibble> 

Así que mi parámetro está llegando correctamente, simplemente no puedo acceder correctamente. ¿Puede alguien decirme cómo puedo conseguir $ xmlElem para imprimir correctamente de modo que veo:

<Wibble> 
     1: Wibble. 
     2: Wibble. 
</Wibble> 

Gracias por cualquier entrada.

+1

He completado algunos huecos que dejan las respuestas anteriores. ¡Buena pregunta! –

+1

Considere marcar la respuesta de Dimitre como "Aceptada" teniendo en cuenta que su respuesta es altamente informativa y explica el "por qué", no solo el "cómo". ¡Gracias! –

Respuesta

31

Todas las respuestas están perdiendo algo importante: leer más:

Puede alguien por favor dígame cómo de impresión a cabo una variable en mi XSL transformar? Parece una cosa fácil de hacer pero no puedo hacerlo hacerlo.

En XSLT 1.0 hay dos formas principales de la producción de los contenidos de un <xsl:variable>, dependiendo de si contiene un valor escalar (cadena, número o boolean), o tiene un valor estructurado - una node- conjunto (uno o más nodos de documento (s) xml):

  1. <xsl:value-of select="$yourscalarVariableName"/> Use este para producir un valor escalar. En realidad produce un nodo de texto, que contiene este valor escalar.

  2. <xsl:copy-of select="$yourStructuredVariableName"/> Utilice esto para generar una copia de todos los nodos que contiene la variable.

Es muy importante saber que si unxsl:variable contiene una lista de nodos y se usa la instrucción <xsl:value-of ...>, se producirá sólo el valor de cadena del primer nodo. Este es un error frecuente y una pregunta frecuente.

Hay una tercera vía: si el <xsl:variable> deben utilizarse en la producción de un atributo: se evalúa

<someLiteralResultElement someAttribute="{$theVariable}"/> 

La expresión XPath en las llaves (llamados AVT -- attribute-value-template) y el resultado se pone en el valor de atributo.

En XSLT 2.0, la instrucción <xsl:value-of .../>, cuando se ejecuta en modo de compatibilidad, produce una lista de los nodos de texto - una para cada nodo contenido en el xsl:variable. Cuando se ejecuta en modo de compatibilidad (tiene especificado el atributo version="1.0"), la instrucción <xsl:value-of> se comporta de la misma manera que en XSLT 1.0.

En Xslt 2.0<xsl:copy-of> se comporta de la misma manera que en XSLT 1.0. Sin embargo, se recomienda utilizar la nueva instrucción <xsl:sequence>, porque la primera produce una copia nueva de cada nodo, mientras que <xsl:sequence> no produce nuevas copias de nodos.

+0

+1 Muy informativo y muy bien hecho! –

+0

@ Andrew-Hare ¡Gracias, valoro mucho su opinión! –

10

Prueba esto:

<xsl:value-of select="$xmlElem"/> 
+0

¡Crees que lo hubiera intentado! Gracias. –

+0

¡A veces la solución más simple es la más elusiva! Me alegro de poder ayudar :) –

4

que puede utilizar:

<xsl:value-of select="$xmlElem" /> 
3

El {} $ xmlElem sintaxis sólo funciona dentro de un atributo. Es necesario:

<xsl:value-of select="$xslElem" /> 
Cuestiones relacionadas