2008-11-25 115 views
1

当我尝试使用下面的代码时,由于变量是不可变的,所以得到一个重复的变量错误。如何将两个变量中的较小者($nextSubPartPos和​​)设置为我的新变量($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> 

回答

3

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

也就是说,你要设置变量的值与选择。有两种方法可以设置变量的值。一个是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> 
0

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

+0

有什么办法可以获得两者中较大的一个? – joe 2008-11-25 18:05:25

+0

@joe,是的。在我的回答中用max代替min或在 – phihag 2008-11-25 18:26:48

+0

问题中< and >是的,但这是一个新问题。 :)看到我的答案,它提供了更加紧凑和优雅的XPath 1.0解决方案和两种不同的XPath 2.0解决方案。 – 2008-11-26 02:47:23

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

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

5

一种紧凑的XPath 1.0表达式,其值较小的值是:

        $ V1 *($ V2> = $ V1)+ $ V2 *($ V1> $ V2)

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

所以,一个优雅的一行XSLT 1.0解决方案将是这样的:

        <的xsl:变量名= “V3” 选择=“$ V1 *($ V2> = $ V1 )+ $ v2 *($ v1> $ v2)“/>

根据XSLT 2的要求定义变量更容易。0:

人们可以使用以下任一(更可读的)的一行:

       如果($ V2 GT $ V1)
                                then $ v1
                               别的$ V2

或者更紧凑:

        分钟(($ V1,$ V2))