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: снова вызывать инструкцию, потому что он довольно длинный и интенсивный вычисление в реальном примере.

Соответствующая среда - libxslt (xslt 1.0) с расширениями exslt.

EDIT: то, что я хочу, - это поведение, подобное

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

Ответ 1

Что бы вы могли, ваша основная переменная возвращает список элементов; по одной для каждой переменной, которую вы хотите установить

  <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, вы можете преобразовать это в 'node set', который затем можно использовать для установки ваших отдельных переменных

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

Не забывайте, что вам нужно будет объявить имя для функций exslt в XSLT, чтобы это работало.

Ответ 2

Но что, если я хочу назначить две переменные в зависимости от того же условие $someCondition?

Я не хочу писать один и тот же xsl: снова выберите инструкцию, потому что она является несколько длинным и интенсивным вычислением в реальном примере.

Предполагая, что значения переменных не являются узлами, этот код не использует какую-либо функцию расширения для их определения:

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