Pregunta

Estoy tratando de usar variables XSLT y no tengo mucho éxito, espero hacer algo tonto.

Tengo el siguiente fragmento de código:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xalan="http://xml.apache.org/xslt"
  version="1.0">

    <xsl:template match="/">
      <xsl:variable name="config" select="query/@config"></xsl:variable>

así que espero que haya una variable 'config' configurada con el valor del atributo 'config' de mi 'consulta' del elemento de nivel superior.

Luego trato de usar la variable más adelante en mi hoja de estilo, por ejemplo:

<a href="localhost/test?go">
    {$config}
</a>

pero el resultado que veo en mi documento HTML de salida es:

<*>

por lo que el valor no se ha sustituido como esperaba.

Creo que este es el caso más simple que podría haber, ¡así que estoy haciendo una estúpida tontería! Por favor ayuda, gracias!


ACTUALIZACIÓN gracias a todos los que respondieron, entendí mal los diferentes contextos de si estaba trabajando en un atributo o fuera. ¡Resolví mi problema muy bien!

Si pudiera, aceptaría dos respuestas, la que tengo, y la de @Aaron Digulla, lo que explica los atributos.

¿Fue útil?

Solución

En su hoja de estilo debe usar:

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

en lugar de:

{$config}

Otros consejos

Aquí hay dos preguntas que parecen iguales, pero que son sutilmente diferentes: 1) ¿Cómo hago referencia a una variable por su nombre? 2) ¿Dónde puedo hacer referencia a una variable por nombre?

Primero, las variables siempre se referencian usando la sintaxis $varname. En segundo lugar, esto se puede hacer en cualquier lugar donde se permita una expresión . Es la segunda parte de esto lo que parece confundir. Para empezar, el valor de un elemento o atributo se generará literalmente de manera predeterminada, por lo que no se hace referencia a ninguna variable en el siguiente ejemplo:

<element attr="$test">$test or {$test}</element>

La salida coincidirá literalmente con lo que se escribió.

Para generar el valor de una variable, necesitamos hacer referencia a ella donde se permite una expresión. En el contenido del elemento, usamos xsl:value-of; en atributos que se tratan como una Plantilla de valor de atributo (por ejemplo, los atributos de un elemento de resultado literal), las expresiones están delimitadas por llaves {}. Asuma la siguiente declaración:

<xsl:variable name="test" select="'value'"/>

... luego lo siguiente:

<element attr="{$test}"><xsl:value-of select="$test"/></element>

... resulta en:

<element attr="value">value</element>

Algunas notas de despedida sobre AVT y value-of:

  • En ambos casos la variable fue referenciada como $test. Las llaves en un AVT no son parte de la referencia variable; son delimitadores de expresión.
  • En cualquier caso, la expresión no necesita haber contenido una referencia a una variable; cualquier expresión XPath se hubiera permitido.
  • No todos los atributos en un documento XSLT se tratan como plantillas de valor de atributo. Por ejemplo, observe que el xsl:value atributo select ya acepta una expresión como contenido.
  • Pregunta : ¿Por qué no puede usar {$varname} en un atributo, como este?

    <element attr="<xsl:value-of select="$test"/>"/>
    

    Respuesta : Porque los documentos XSLT deben contener XML bien formado (y eso no lo es).

  • Pregunta : ¿Por qué no puede usar <=> en el contenido del elemento?

    Respuesta Glib : porque los creadores de XSLT no lo diseñaron de esa manera.

{$config} solo funciona en atributos de elementos XSLT. (Nota: dólar dentro de la llave porque la expresión XPath completa debe estar rodeada por llaves)

Use <xsl:value-of select="$config"/> en lugar de {$config}.

La respuesta de

@ lwburk es excelente (+1), pero la última pregunta / respuesta solo es precisa para XSLT 1.0 y 2.0. En 3.0 puede usar una TVT ( Plantilla de valor de texto ; similar a la AVT (plantilla de valor de atributo) mencionada en la respuesta de @ lwburk).

Para usar un TVT, agregue el atributo estándar xsl:expand-text="yes" al elemento. Esto hará que el procesador trate los nodos de texto descendientes de ese elemento como un TVT.

Ejemplo:

XSLT 3.0

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes"/>

    <xsl:template match="/">
        <xsl:variable name="who" select="'Dan'"/>
        <xsl:variable name="what" select="'BAM!'"/>
        <result xsl:expand-text="yes">This is {$who}'s result: {$what}</result>
    </xsl:template>

</xsl:stylesheet>

Salida (usando cualquier XML bien formado como entrada)

<result>This is Dan's result: BAM!</result>

Nota: Probado con Saxon-PE 9.5.

Porque necesita usar <xsl:value-of select="config"/>?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top