2013-10-08 6 views

Antwort

10

Variablen in XSLT darf nur einmal ein Wert zugewiesen werden. Dies geschieht durch Design. Siehe Why Functional languages? für eine Einschätzung der Motivation im Allgemeinen.

Anstatt eine Variable neu zuzuweisen, schreiben Sie Bedingungen direkt in das Eingabedokument oder rufen Sie eine Funktion (oder eine benannte Vorlage) rekursiv mit variierenden lokalen Parametern auf.

Alles, was Sie tun müssen, kann mit einem Ansatz durchgeführt werden, der keine Neuzuordnung von Variablen erfordert. Um eine spezifischere Antwort zu erhalten, geben Sie eine spezifischere Frage an. auch

Siehe:

1

Sie können nicht - ‚Variablen‘ in XSLT sind eigentlich mehr wie Konstanten in anderen Sprachen, sie nicht Wert ändern können.

+0

Gibt es einen Weg zu tun, was ich brauche? Vielen Dank –

5

einfach mehrere Variablen verwenden. Hier ist Ihr Beispiel funktioniert gemacht ...

<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

zuweisbare Variablen deklariert werden kann, einen Speicher verwenden, die von 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> 
Verwandte Themen