XSLT: Set multiple variables depending on condition

Jost picture Jost · Sep 7, 2012 · Viewed 10.4k times · Source

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

Answer

Tim C picture Tim C · Sep 7, 2012

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.