2013-10-08 26 views

cevap

10

XSLT'deki değişkenlere yalnızca bir kez bir değer atanabilir. Bu tasarım ile yapılır. Genel olarak motivasyonu takdir etmek için Why Functional languages?'a bakınız. Bir değişkeni yeniden atamak yerine, doğrudan girdi belgesine karşı koşullu yazabilir veya çeşitli yerel parametrelerle yinelemeli olarak bir işlev (veya adlandırılmış şablon) çağrısı yapabilirsiniz.

Yapmanız gereken her şey, değişkenlerin yeniden atanmasını gerektirmeyen bir yaklaşımla yapılabilir. Daha spesifik bir cevap almak için daha spesifik bir soru sorun.

Ayrıca bakınız:

1

Sen olamaz - XSLT'de 'değişkenleri' daha başka dillerde sabitler gibi aslında, onlar değerini değiştiremez.

+0

İhtiyacım olanı yapmanın bir yolu var mı? Teşekkürler –

5

Sadece çoklu değişkenleri kullanın. İşte örnek

<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

Tekrar atanabilir değişkenleri XSLT sürüm 3.0 edinilebilir Bir akümülatör kullanılarak bildirilebilir ... çalışmaya yapılmış. :

<?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> 
İlgili konular