10

我想根据一种条件环境分配多个变量。我只知道如何为一个变量做到这一点:

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

2 回答 2

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 函数声明名称空间才能使其工作。

于 2012-09-07T12:37:52.687 回答
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, '|')"/>
于 2012-09-07T12:42:18.910 回答