Jost
Jost

Reputation: 5840

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 = "...";
}

Upvotes: 11

Views: 11713

Answers (2)

Dimitre Novatchev
Dimitre Novatchev

Reputation: 243469

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, '|')"/>

Upvotes: 3

Tim C
Tim C

Reputation: 70608

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.

Upvotes: 11

Related Questions