2012-09-07 7 views
10

Bir koşul ortamına bağlı olarak birden fazla değişken atamak istiyorum. Sadece bir değişken için bunun nasıl biliyorum:XSLT: Koşullara bağlı olarak birden çok değişken ayarlayın

<xsl:variable name="foo"> 
    <xsl:choose> 
     <xsl:when test="$someCondition"> 
      <xsl:value-of select="3"/> 
     <xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="4711"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

Ama benim aynı koşul $ someCondition bağlı iki değişken atamak isterseniz?

Aynı xsl: ifadesini tekrar yazmak istemiyorum, çünkü gerçek örnekte biraz uzun ve hesaplamalıdır.

Söz konusu ortam, exslt uzantılarına sahip libxslt (xslt 1.0) 'dir.

DÜZENLEME: İstediğim şey size ana değişken unsurların listesini döndürür var olan ne olabilir

if (condition) { 
    foo = 1; 
    bar = "Fred"; 
} 
else if (...) { 
    foo = 12; 
    bar = "ASDD"; 
} 
(... more else ifs...) 
else { 
    foo = ...; 
    bar = "..."; 
} 

cevap

11

benzer bir davranıştır; Eğer EXSLT işlevini kullanarak, Sonra

<xsl:variable name="all"> 
    <xsl:choose> 
     <xsl:when test="a = 1"> 
      <a> 
       <xsl:value-of select="1"/> 
      </a> 
      <b> 
       <xsl:value-of select="2"/> 
      </b> 
     </xsl:when> 
     <xsl:otherwise> 
      <a> 
       <xsl:value-of select="3"/> 
      </a> 
      <b> 
       <xsl:value-of select="4"/> 
      </b> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:variable> 

ayarlamak istediğiniz her bir değişken, daha sonra tek tek değişkenleri ayarlamak için kullanılabilecek bir 'düğüm kümesi' bu dönüştürebilir için bir

<xsl:variable name="a" select="exsl:node-set($all)/a"/> 
    <xsl:variable name="b" select="exsl:node-set($all)/b"/> 

Don Bunun işe yaraması için XSLT'deki exslt işlevleri için isim alanını bildirmeniz gerekeceğini unutmayın.

+0

güzel bir :-) – Jost

+0

1 Parlak fikir bu! – Fernando

3

Ancak, aynı koşuluna bağlı olarak iki değişken atamak istersem $ someCondition?

Aynı xsl: ifadesini tekrar yazmak istemiyorum çünkü gerçek örnekte biraz uzun ve hesaplama yoğun. değişkenlerin değerlerini varsayarsak

değil düğümleri vardır, bu kod bunları tanımlamak için herhangi bir uzatma fonksiyonunu kullanmaz:

<xsl:variable name=vAllVars> 
    <xsl:choose> 
     <xsl:when test="$someCondition"> 
      <xsl:value-of select="1|Fred"/> 
     <xsl:when> 
     <xsl:when test="$someCondition2"> 
      <xsl:value-of select="12|ASDD"/> 
     <xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="4711|PQR" /> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

<xsl:variable name="foo" select="substring-before($vAllVars, '|')"/> 
<xsl:variable name="bar" select="substring-after($vAllVars, '|')"/> 
+0

Bunu kullanarak, foo ve bar her zaman aynı değere sahip olacaktır. İhtiyacım olan bu değil ... Açıklık için düzenlememe bakın. – Jost

+0

@Jost, Evet, güncellememi görün. Değişkenlerin değerleri düğüm olmadığında, sonuç ağacını oluşturmamak (ve dönüştürmek) daha kolay ve muhtemelen daha etkilidir. Bu çözüm –

+0

çalışmalıdır. Ancak bir dezavantaj vardır: Bulmak zor olabilecek değişken değerlerin hiçbirinde asla oluşamayan bir ayırıcıya ihtiyacınız vardır. Ve birini seçtikten sonra, bu programın diğer bazı bölümleri değiştiğinde bir şeylerin gelecekte kırılabileceği bir yer olurdu ... – Jost