我想根据一个条件环境分配多个变量。我知道如何只为一个变量做到这一点:
<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语句,因为它在实际示例中有点冗长且计算密集。
有问题的环境是libxslt(xslt 1.0),扩展名为exslt。
编辑:我想要的是一种类似于
的行为if (condition) {
foo = 1;
bar = "Fred";
}
else if (...) {
foo = 12;
bar = "ASDD";
}
(... more else ifs...)
else {
foo = ...;
bar = "...";
}
答案 0 :(得分: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函数声明namepsace以使其正常工作。
答案 1 :(得分: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, '|')"/>