Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XSLT: Set multiple variables depending on condition

I want to assign multiple variables depending on one condition environment. I know how to do that for only one variable:

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

But what if I want to assign two variables depending on the same condition $someCondition?

I don't want to write the same xsl:choose statement again, because it is somewhat lengthy and computation intensive in the real example.

The environment in question is libxslt (xslt 1.0) with exslt extensions.

EDIT: What i want is a behaviour similar to

if (condition) {
    foo = 1;
    bar = "Fred";
}
else if (...)  {
    foo = 12;
    bar = "ASDD";
}
(... more else ifs...)
else {
    foo = ...;
    bar = "...";
}
like image 539
Jost Avatar asked Sep 07 '12 12:09

Jost


2 Answers

What you could is have your main variable return a list of elements; one for each variable you want to set

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

Then, using the exslt function, you can convert this to a 'node set' which can then be used to set your individual variables

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

Don't forget you'll need to declare the namepsace for the exslt functions in the XSLT for this to work.

like image 73
Tim C Avatar answered Oct 31 '22 12:10

Tim C


But what if I want to assign two variables depending on the same condition $someCondition?

I don't want to write the same xsl:choose statement again, because it is somewhat lengthy and computation intensive in the real example.

Assuming the values of the variables are not nodes, this code doesn't use any extension function to define them:

<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, '|')"/>
like image 32
Dimitre Novatchev Avatar answered Oct 31 '22 14:10

Dimitre Novatchev