2008-11-25 106 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))

相關問題