2013-10-08 11 views

Odpowiedz

10

Zmiennym w XSLT można przypisać wartość tylko raz. Odbywa się to według projektu. Zobacz Why Functional languages?, aby zapoznać się ogólnie z motywacją.

Zamiast zmieniać przypisanie zmiennej, należy zapisać warunki bezpośrednio na dokumencie wejściowym lub wywołać rekursywnie funkcję (lub nazwany szablon) ze zmiennymi parametrami lokalnymi.

Wszystko, co musisz zrobić, można zrobić za pomocą podejścia, które nie wymaga zmiany przypisania zmiennych. Aby otrzymać bardziej szczegółową odpowiedź, podaj bardziej szczegółowe pytanie.

Zobacz także:

1

Nie można - „zmienne” w XSLT są rzeczywiście bardziej stałe w innych językach, nie mogą zmienić wartość.

+0

Czy jest sposób na zrobienie tego, czego potrzebuję? Dzięki –

5

Wystarczy użyć wielu zmiennych. Tu masz przykład wykonane do pracy ...

<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

zmienne ponownie przypisać można zadeklarować za pomocą akumulatora, dostępne od wersji 3.0 XSLT. :

<?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> 
Powiązane problemy