2012-09-07 68 views
10

我想根據一個條件環境分配多個變量。我知道如何做到這一點的只有一個變量:XSLT:根據條件設置多個變量

<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> 

但是如果我想根據相同的條件$ someCondition分配兩個變量?

我不想再次編寫相同的xsl:choose語句,因爲它在實際示例中有點冗長和計算密集。

有問題的環境是帶有exslt擴展名的libxslt(xslt 1.0)。

編輯:我想是類似於

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

回答

11

行爲是什麼,你可以是有你的主要變量返回元素的列表;一個是你要設置

<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> 

然後,使用EXSLT函數中的每個變量,可以將此轉換爲隨後可用於設置你的個人變量「節點集」

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

唐別忘了你需要在XSLT中聲明exslt函數的名稱以使其工作。

+0

那是一個很好的一個:-) – Jost

+0

+1輝煌的想法! – Fernando

3

但是,如果我想分配兩個變量取決於相同的 條件$ someCondition?

我不想再次編寫相同的xsl:choose語句,因爲它在實際示例中有點冗長且計算密集。

假設變量的值不是節點,這個代碼不使用任何擴展功能來定義它們:

<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

使用這個,foo和bar將始終具有相同的值。這不是我所需要的...查看我的編輯進行澄清。 – Jost

+0

@Jost,是的,看我的更新。每當變量的值不是節點時,根本不需要構建(並轉換)結果樹就可以更容易,更有效。 –

+0

此解決方案應該可以工作。但是有一個缺點:你需要一個永遠不會出現在任何變量值中的分隔符,這可能很難找到。並選擇一個後,這將是一個地方,東西可能在未來的其他部分的程序更改時打破... – Jost