web-dev-qa-db-fra.com

Comment changer ou réaffecter une variable dans XSLT?

Comment puis-je réaffecter une valeur à une variable précédemment assignée? J'ai besoin que ça fonctionne comme ça:

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

Les variables dans XSLT ne peuvent recevoir une valeur qu'une seule fois. Ceci est fait par la conception. Voir Pourquoi les langages fonctionnels? pour une appréciation de la motivation en général.

Plutôt que de réaffecter une variable, écrivez directement des conditions sur le document d'entrée ou appelez une fonction (ou un modèle nommé) de manière récursive avec des paramètres locaux variables.

Tout ce que vous devez faire peut être fait avec une approche qui ne nécessite pas de réaffectation de variables. Pour recevoir une réponse plus précise, fournissez une question plus précise.

Voir également:

14
kjhughes

Il suffit d'utiliser plusieurs variables. Voici votre exemple fait pour travailler ...

    <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>
5
Gary Sheppard

Vous ne pouvez pas - les variables dans XSLT ressemblent en réalité davantage à des constantes dans d'autres langues, elles ne peuvent pas changer de valeur.

1
MiMo

Les variables réaffectables peuvent être déclarées à l'aide d'un accumulateur, disponible à partir de XSLT version 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>
0
Wolfgang Grinfeld