将变量设置为另外两个变量中较小的一个

时间:2008-11-25 18:00:25

标签: xslt

当我尝试使用下面的代码时,我得到一个重复的变量错误,因为变量是不可变的。如何将两个变量中较小的一个($nextSubPartPos$nextQuestionStemPos)设置为我的新变量($nextQuestionPos)?

        <xsl:variable name="nextQuestionPos"/>
        <xsl:choose>
            <xsl:when test="$nextSubPartPos &lt; $nextQuestionStemPos">
                <xsl:variable name="nextQuestionPos" select="$nextSubPartPos"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="nextQuestionPos" select="$nextSubPartPos"/>
            </xsl:otherwise>
        </xsl:choose>

4 个答案:

答案 0 :(得分:5)

评估为较小值的紧凑型XPath 1.0表达式为:

$ v1 *($ v2&gt; = $ v1)+ $ v2 *($ v1&gt; $ v2)

其中$ v1和$ v2变量包含要比较的值。

因此,优雅的单行XSLT 1.0解决方案将如下所示:

&lt; xsl:variable name =“v3”select =“$ v1 *($ v2&gt; = $ v1)+ $ v2 *($ v1&gt; $ v2)”/&gt;

在XSLT 2.0中根据需要定义变量更容易:

可以使用以下(更易读)单行:

if($ v2 gt $ v1)
那么$ v1
别的$ v2

或者更紧凑:

min(($ v1,$ v2))

答案 1 :(得分:3)

不要在第一行中关闭xsl:variable节点。也就是说,取出/取出它,然后在</xsl:variable>之后加</xsl:choose>。接下来,将选择中的<xsl:variable>节点更改为<xsl:value-of>个节点。

也就是说,您想要使用choose设置变量的值。有两种方法可以设置变量的值。一个是select属性,另一个是节点的内部文本。

<xsl:variable name="nextQuestionPos">
    <xsl:choose>
         <xsl:when test="$nextSubPartPos &lt; $nextQuestionStemPos">
               <xsl:value-of select="$nextSubPartPos"/>
         </xsl:when>
         <xsl:otherwise>
               <xsl:value-of select="$nextSubPartPos"/>
         </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

答案 2 :(得分:2)

只需使用min功能:

<xsl:variable name="a" select="42" />
<xsl:variable name="b" select="23" />
<xsl:variable name="x" select="min(($a,$b))" />

在您的示例中,将整个代码替换为:

<xsl:variable name="nextQuestionPos" select="min(($nextSubPartPos,$nextQuestionStemPos))" />

Saxon在全局命名空间中实现min。其他处理器可能需要命名空间,正确的(通常表示为fn)是http://www.w3.org/2005/02/xpath-functions

答案 3 :(得分:0)

XSLT中的变量是不可变的。这让我多次绊倒。