当我尝试使用下面的代码时,我得到一个重复的变量错误,因为变量是不可变的。如何将两个变量中较小的一个($nextSubPartPos
和$nextQuestionStemPos
)设置为我的新变量($nextQuestionPos
)?
<xsl:variable name="nextQuestionPos"/>
<xsl:choose>
<xsl:when test="$nextSubPartPos < $nextQuestionStemPos">
<xsl:variable name="nextQuestionPos" select="$nextSubPartPos"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="nextQuestionPos" select="$nextSubPartPos"/>
</xsl:otherwise>
</xsl:choose>
答案 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 < $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中的变量是不可变的。这让我多次绊倒。