Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 将一个变量设置为其他两个变量中较小的一个_Xslt - Fatal编程技术网

Xslt 将一个变量设置为其他两个变量中较小的一个

Xslt 将一个变量设置为其他两个变量中较小的一个,xslt,Xslt,当我尝试使用下面的代码时,我得到了一个重复的变量错误,因为变量是不可变的。如何将两个变量($nextSubPartPos和$nextquestionstepos)中的较小者设置为新变量($nextQuestionPos) XSLT中的变量是不可变的。这让我多次感到困惑。XSLT中的变量是不可变的。这已经让我犯了很多次错误。不要关闭第一行中的xsl:variable节点。也就是说,将/取出,然后在之后放置一个。接下来,将choose to节点中的节点更改为节点 也就是说,您希望使用choose设

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



XSLT中的变量是不可变的。这让我多次感到困惑。

XSLT中的变量是不可变的。这已经让我犯了很多次错误。

不要关闭第一行中的xsl:variable节点。也就是说,将/取出,然后在
之后放置一个
。接下来,将choose to
节点中的
节点更改为
节点

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

<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>

不要关闭第一行中的xsl:variable节点。也就是说,将/取出,然后在
之后放置一个
。接下来,将choose to
节点中的
节点更改为
节点

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

<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>

只需使用
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

只需使用
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

计算值较小的紧凑XPath 1.0表达式是:

$v1*($v2>=$v1)+$v2*($v1>$v2)

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

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

根据XSLT 2.0中的要求定义变量更容易:

可以使用以下(更可读的)一行程序:

如果($v2 gt$v1)
然后是$v1
else$v2

或者更紧凑:


min(($v1,$v2))计算值较小的紧凑XPath 1.0表达式是:

$v1*($v2>=$v1)+$v2*($v1>$v2)

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

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

根据XSLT 2.0中的要求定义变量更容易:

可以使用以下(更可读的)一行程序:

如果($v2 gt$v1)
然后是$v1
else$v2

或者更紧凑:


min($v1,$v2))

有什么办法可以得到两个中较大的一个吗?@joe,是的。在我的回答中用max替换min,或在问题中用max替换,是的,但这是一个新问题。:)请看我的答案,它提供了更紧凑、更精巧的XPath 1.0解决方案和两种不同的XPath 2.0解决方案。有没有办法从这两种解决方案中取较大的一种?@joe,是的。在我的回答中用max替换min,或在问题中用max替换,是的,但这是一个新问题。:)请看我的答案,它提供了更紧凑、更精巧的XPath 1.0解决方案和两种不同的XPath 2.0解决方案。这解决了眼前的问题,但没有解决如何实现复杂逻辑(可能是XPath过于复杂的逻辑)以形成变量值的更大问题。这解决了眼前的问题,但是没有解决更大的问题,即如何实现复杂的逻辑(可能逻辑对于XPath来说太复杂了),以形成变量的值。@yegor256,同意,对于XSLT 2.0。@yegor256,同意,对于XSLT 2.0。