2010-11-17 21 views
18

Bu kodu çalıştırmak için ne yapabilirim?XSLT: global olarak bir değişken bildirebilir ve daha sonra buna bir değer atayabilir miyim

<xsl:choose> 
    <xsl:when test='type = 6'> 
    <xsl:variable name='title' select='root/info/title' /> 
    </xsl:when> 
    <xsl:when test='type = 7'> 
    <xsl:variable name='title' select='root/name' /> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:variable name='title'>unknown</xsl:variable> 
    </xsl:otherwise> 
</xsl:choose> 

<div class='title'> 
    <xsl:value-of select='$title'/> 
</div> 

i <xsl:value-of select='$title'/> yaptığınızda Bunun nedeni çalışmaz, $title kapsamı dışındadır. <xsl:variable name='title'/> hattını kapsam dışında eklemeyi denedim, ancak bu da işe yaramıyor, çünkü örneğin <xsl:variable name='title' select='root/info/title' />'u aradığımda, daha önce bu değişkeni ayarladım. Bunu nasıl çözmeliyim?

+1

İyi soru, +1. Üç farklı çözüm için cevabımı görün. :) –

cevap

27

Sen taşıyabilirsiniz böyle, değişkenin ayar içine seç:

<xsl:variable name="title"> 
    <xsl:choose> 
    <xsl:when test='type=6'> 
     <xsl:value-of select="root/info/title" /> 
    </xsl:when> 
    ... 
    </xsl:choose> 
</xsl:variable> 

<div class='title'> 
    <xsl:value-of select="$title" /> 
</div> 
+1

Evet, ben de öyle düşünüyordum. Bu çözümü pek sevmiyorum çünkü her biri 5 değişkene ihtiyaç duyan 20'den fazla türüm var. Her tür için bu 5 değişkeni birbiri ardına sıralayabilirsem, bu benim kodumu daha net hale getirirdi ve başka bir tür eklemek daha kolay olurdu. Önereceğiniz çözümle, beş değişkenin her birinde yeni tür için bir satır eklemeniz gerekiyorsa. Ama bence başka bir yol olmayacak. Ben bunun üstesinden geleceğim, cevabınız için teşekkürler :) –

+0

Seçim yerine her değişkenin içinde bir çağrı şablonu yapabilir ve ardından tek bir şablonda seçim yapabilirsiniz. – carols10cents

+0

Oh, ama bekle - o zaman şablonun içine koyduğun değişkeni kontrol etmelisin;) – carols10cents

3

XSLT'de (1.0) değişkenleri yeniden atayamazsınız. İsim muhtemelen şans eseri değil; Bir xsl:variable, bir değişkenden daha fazla bir semboldür. Aşağıdaki kullanabileceğiniz örnekte

:

<xsl:variable name='title'> 
    <xsl:choose> 
    <xsl:when test='type = 6'> 
     <xsl:value-of select='root/info/title' /> 
    </xsl:when> 
    <xsl:when test='type = 7'> 
     <xsl:value-of select='root/name' /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>unknown</xsl:text> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 
+0

Bu bir değişmez, sabit bir değişmez değil. Ama bu deklaratif paradigmada bir değişken: daha çok bir denklemdeki bir değişken gibi. –

+1

@Alejandro: Evet, Michael Kay tarafından açıklandığı gibi matematiksel anlamda olduğu gibi sembol/değişkene atıfta bulunuyordum: "Bazı insanlar sordu, niçin değiştiremezseniz değişken olarak adlandırsın? Cevap, geleneksel matematikseldir. değişken değişkeni kullanımı: değişken, farklı durumlarda farklı değerleri göstermek için kullanılabilecek bir semboldür. " (http://gandhimukul.tripod.com/xslt/facts.html) –

11
<xsl:choose> 
    <xsl:when test='type = 6'> 
    <xsl:variable name='title' select='root/info/title' /> 
    </xsl:when> 
    <xsl:when test='type = 7'> 
    <xsl:variable name='title' select='root/name' /> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:variable name='title'>unknown</xsl:variable> 
    </xsl:otherwise> 
</xsl:choose> 

<div class='title'> 
    <xsl:value-of select='$title'/> 
</div> 

Bu kötü kokan t iş

Bu bir SSS:

Her biri $title adında ve her biri işe yaramaz olarak adlandırılan birkaç değişkeni tanımlamanız yeterlidir;

koşullara dayalı bir değişken tanımlamak için XSLT 1.0 uygun yolu geçerli:

<xsl:variable name="vTitle"> 
    <xsl:choose> 
     <xsl:when test='type = 6'> 
     <xsl:value-of select='root/info/title' /> 
     </xsl:when> 
     <xsl:when test='type = 7'> 
     <xsl:value-of select='root/name' /> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="'unknown'"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

tanımlamanın diğer bir yolu aynı değişken: Bu özel durumda değişken bir dize sahip olmak istiyorum değer. Bu, daha kompakt bir biçimde ifade edilebilir:

<xsl:variable name="vTitle2" select= 
"concat(root/info/title[current()/type=6], 
     root/name[current()/type=7], 
     substring('unknown', 1 div (type > 7 or not(type > 5))) 
     ) 
"/> 

Son olarak, XSLT'de 2.0 bir daha da uygun bir değişkeni tanımlamak: @ carolclarinet en Standar cevap ve daha kompakt yanında

<xsl:variable name="vTitle3" as="xs:string" select= 
"if(type eq 6) 
    then root/info/title 
    else if(type eq 7) 
      then root/name 
      else 'unknown' 
"/> 
+0

'çünkü hemen kapsam dışı kalıyor. Hangi etiket kapsamı tanımlar, 'xsl: choose'? Benim problemim, tek bir teste bağlı olarak yaklaşık 50 değişken kurmaya çalıştığım ve her bir değişkenin testi tekrarlamasını istemiyorum. Bunu mantıksal olarak benzer bir şekilde yapmaya çalıştım (seç, (ne zaman (a), değişkeni *), ((b), değişkeni *)) ve böylece kapsam dışı kaldım ... tek bir yolu kullanmanın bir yolu var Birden çok değişken için test edin ama yine de bunları kapsamda tutun? – n611x007

1

@ Dimitre'nin cevabı, sonuç bazı düğümlere bağlı olduğunda ve yeniden kullanım ve genişletilebilirlik konusunda endişeleriniz varsa, şablon uygulayabilir ve şablon eşleştirmesi kullanabilirsiniz, örneğin:

<xsl:variable name="title"> 
    <xsl:apply-templates select="type" mode="title"/> 
</xsl:variable> 

<xsl:template match="type[.=6]" mode="title"> 
    <xsl:value-of select='../root/info/title"/> 
</xsl:template> 
<xsl:template match="type[.=7]" mode="title"> 
    <xsl:value-of select='../root/name"/> 
</xsl:template> 
<xsl:template match="type" mode="title"> 
    <xsl:text>unknown</xsl:text> 
</xsl:template> 
-1

Yerel değeri xml xsl:desult _document klasörüne kaydetmek için yapıyorum /temp_variables_loop/loop-data-id_(position()).xml.

Ve sonraki döngüde/temp_variables_loop.alias/loop-data-id_(position()-1).xml'dan dosyaları okurum.

Bir xsl dosyasında aynı dosyayı okuyamaz ve yazamadığınız için /temp_variables_loop - temp_variables_loop.alias için xsl motorunu almanız gerekir.

İlgili konular