2013-10-08 9 views
11

Come posso riassegnare un valore a una variabile precedentemente assegnata? Ho bisogno di opere come questa:Come cambiare o riassegnare una variabile in XSLT?

<xsl:variable name="variable2" select="'N'" /> 
.... 
<xsl:when test="@tip = '2' and $variable2 != 'Y'">             
    <xsl:variable name="variable2" select="'Y'" /> 
</xsl:when> 

risposta

10

Le variabili in XSLT possono essere assegnate un valore solo una volta. Questo è fatto dal design. Vedi Why Functional languages? per un apprezzamento della motivazione in generale.

Invece di riassegnare una variabile, scrivere condizionali sul documento di input direttamente o chiamare una funzione (o un modello con nome) in modo ricorsivo con parametri locali variabili.

Tutto ciò che devi fare può essere fatto con un approccio che non richiede la riassegnazione delle variabili. Per ricevere una risposta più specifica, fornire una domanda più specifica.

Consulta anche:

1

Non è possibile - 'variabili' in XSLT sono in realtà più simile costanti in altre lingue, non possono modificare il valore.

+0

C'è un modo per fare ciò di cui ho bisogno? Grazie –

5

Basta usare più variabili. Ecco il tuo esempio fatto per lavorare ...

<xsl:variable name="variable1" select="'N'" /> 
    .... 
    <xsl:variable name="variable2"> 
     <xsl:choose> 
      <xsl:when test="@tip = '2' and $variable1 != 'Y'"> 
       <xsl:value-of select="'Y'" /> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$variable1" /> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
0

variabili riconfigurabile possono essere dichiarate utilizzando un accumulatore, disponibile da XSLT versione 3.0. :

<?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="3.0" > 
     <xsl:mode use-accumulators="variable2" streamable="no"/> 
     <xsl:output omit-xml-declaration="no" indent="yes"/> 

     <xsl:accumulator name="variable2" initial-value="'N'"> 
     <xsl:accumulator-rule match="Inpayment" select="if ($value = 'N' and @tip = '2') then 'Y' else 'N' "/> 
     </xsl:accumulator> 

     <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
     </xsl:template> 

     <xsl:template match="Inpayment"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:value-of select="accumulator-before('variable2')"/> 
      <xsl:apply-templates select="node()"/> 
     </xsl:copy> 
     </xsl:template> 

    </xsl:stylesheet>