2012-03-08 46 views
6

Estoy usando la siguiente manera para asignar valor a una variable.Asignar a <xsl: variable> después de ladecoración

<xsl:variable name="NewValue"> 
    <xsl:value-of select="normalize-space(//root/id/amount)"/> 
</xsl:variable> 

Después de la asignación, quiero asignar un nuevo valor a la misma variable. De esta manera: -

<xsl:variable name="NewValue" select="normalize-space(//root/id/amountnew)"> 

¿Hay alguna manera de hacerlo?


Aquí la muestra de XML que tengo:

<VolLien> 
    <Vest_DocType>SDD</Vest_DocType> 
    <Vest_Instrument>395072</Vest_Instrument> 
    <Vest_OfOfficialEntity>eee</Vest_OfOfficialEntity> 
    <Vest_RecDate>12/24/2009</Vest_RecDate> 
    <Vest_Grantee1>abc dd</Vest_Grantee1> 
    <Vest_Grantor1>sss</Vest_Grantor1> 
    <Vest_RejectCode /> 
    <Vest_RejectReason /> 
    <Vest_ImageNum> </Vest_ImageNum> 
</VolLien> 

mi problema es que necesita para recibir las últimas <Vest_RecDate> de especial <Vest_DocType> (digamos SDD) Y entonces tengo que buscar en el xml cualquier fecha que es anterior a <Vest_RecDate> de este (el mismo SDD).

Si a continuación, levante esa sección en particular (<VolLien>) solo y nuevamente más reciente. Si pudiera reasignarme, posicionaría el nodo y obtendría los valores asociados a eso. Ahora estoy haciendo esto usando otro ciclo. Si hay algo allí, puedo evitar bucles de extrusión.

+0

Agregue una muestra del XML en el que está trabajando, junto con una breve descripción de lo que está tratando de hacer. – Tomalak

+0

Hola, estaba haciendo algunas manipulaciones de reglas en xsl con mis datos xml. Para un cierto escenario, quise reasignar otro valor a la variable que ya está declarada.Esta es la razón por la que busqué alguna opción como esta. De todos modos, gracias por su respuesta rápida y la valiosa información – Varun

+0

@Varun No he entendido completamente sus requisitos, pero eche un vistazo a mi respuesta modificada, quizás esto lo inicie. * (PD: puede eliminar los comentarios, ya que los moví a la pregunta). * – Tomalak

Respuesta

8

No. Las variables XSLT son de solo lectura. No se pueden asignar varias veces.

XSLT no es un lenguaje de programación imperativo como, por ejemplo, PHP. La reasignación de variables es tanto imposible como innecesaria.


EDIT: De acuerdo con su comentario:

Mi problema es que necesito para obtener la última de especial <Vest_DocType> (digamos SDD) y luego tengo que buscar en el xml cualquier fecha que es antes de <Vest_RecDate> de esto (el mismo SDD).

He aquí un fragmento de XSLT que puede hacer esto para usted:

<!-- a key to retrieve all <VolLien> nodes of a particular DocType --> 
<xsl:key name="VolLien-by-DocType" match="VolLien" use="Vest_DocType" /> 

<xsl:template match="/"> 
    <xsl:call-template name="latest-VolLien"> 
    <xsl:with-param name="DocType" select="'SDD'" /> 
    </xsl:call-template> 
</xsl:template> 

<!-- this template processes specified <VolLien> nodes in the right order --> 
<xsl:template name="latest-VolLien"> 
    <xsl:param name="DocType" select="''" /> 

    <xsl:for-each select="key('VolLien-by-DocType', $DocType)"> 
    <!-- sorting is a little complicated because you 
     use dd/mm/yyyy instead of yyyymmdd --> 
    <xsl:sort 
     select=" 
     number(substring(Vest_RecDate, 7, 4)) + 
     number(substring(Vest_RecDate, 4, 2)) + 
     number(substring(Vest_RecDate, 1, 2)) 
     " 
     data-type="number" 
    /> 
    <!-- do something with last <VolLien> (in date order) --> 
    <xsl:if test="position() = last()"> 
     <xsl:apply-templates select="." /> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

<xsl:template match="VolLien"> 
    <!-- this template will actually process the nodes, 
     do whatever you want here --> 
</xsl:template> 
2

adición a la respuesta de Tomalak.

Una variable está limitada/local a un bloque en el que se declara y se le asigna un valor (la declaración y la asignación suceden a la vez).

Supongamos que en el ejemplo:

<xsl:template match="Node1"> 
    <xsl:variable name="test" select="'test_value'"/> 
    <xsl:for-each select="foo"> 
     <xsl:variable name="var1" select="."/> 
     <xsl:value-of select="$var1"/> 
    </xsl:for-each> 
    <xsl:for-each select="bar"> 
     <xsl:value-of select="$var1"/> 
     <!--The variable "$var1" is out of scope.. So above statement is wrong--> 
    </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="Node2"> 
    <xsl:value-of select="$test"/> 
    <!--The variable "$test" is out of scope.. So above statement is wrong too!--> 
    </xsl:template> 
4

La adición adicional a las respuestas anteriores: que está tratando de resolver un problema utilizando técnicas imperativas de bajo nivel que ha aprendido de otros lenguajes de programación. Para ayudarlo a resolver el problema utilizando el enfoque declarativo apropiado para XSLT, necesitaremos una descripción del problema. Haga que sea lo más alto posible: describa la salida como una función de la entrada, en lugar de describir los pasos computacionales que cree que son necesarios para pasar de uno a otro.

Cuestiones relacionadas