2011-08-24 41 views
0

循環的錯誤我有一個for循環在我的XSLT文件,它使用了一個可以工作:在XSLT

<xsl:template name="for.loop"> 

<xsl:param name="i"  /> 
<xsl:param name="count" /> 

<xsl:if test="$i &lt;= $count"> 
    <colspec colname="{concat('c',$i)}"/> 
</xsl:if> 

<xsl:if test="$i &lt;= $count"> 
    <xsl:call-template name="for.loop"> 
     <xsl:with-param name="i"> 
      <xsl:value-of select="$i + 1"/> 
     </xsl:with-param> 
     <xsl:with-param name="count"> 
      <xsl:value-of select="$count"/> 
     </xsl:with-param> 
    </xsl:call-template> 
</xsl:if> 
</xsl:template> 

正如你可以看到,這個模板基本上是一個for循環結構適合於創建Cals表模型的「Colspec」節點。我傳遞給它的參數只是一個存儲索引,它應該是1和一個計數,這意味着應該創建多少個「Colspec」節點。

然後我把這個模板,如:

<xsl:variable name="value"> 
    <xsl:value-of select="number($colsCount)+number($multiRowCellCount2)"/>     
    </xsl:variable>      

<xsl:attribute name="cols"> 
        <xsl:value-of select="$value"/> 
       </xsl:attribute> 

<xsl:call-template name="for.loop"> 
    <xsl:with-param name="i">1</xsl:with-param> 
    <xsl:with-param name="count"><xsl:value-of select="$value"/></xsl:with-param> 
</xsl:call-template> 

奇怪的是,我的地步了「$值」是9,屬性9是「@cols」正確分配,但「 Colspecs「節點已創建89次!但是,當我嘗試另一個文檔時,當「$ value」爲5時,「@cols」和#of「Colspecs」都是正確的。

我迷失在這裏,爲什麼當實際計數只有9時for循環會重複89次?

+2

什麼是您的XML解析器,這使用微軟的工作正常。我能想到的唯一想法就是將所有變量都包含在數字子句中,以便在測試中使用'number($ i)< = number($ count)',並且在調用模板'number($ i)+ 1 ' –

+0

@Bob Vale是完全正確的。我可以在Saxon HE 9.3中重現錯誤,如果我將'number()'添加到測試中,它可以正常工作。 –

+0

@鮑勃,謝謝。這絕對是解決方案,我根本沒有意識到這一點。只需要好奇它爲什麼對5這樣的數字起作用,而對9卻不起作用。 – Kevin

回答

1

當你使用它們時,請確保你將所有的數字變量都包含在數字函數中,因爲我猜測你的解析器將它們視爲字符串並執行concatination(所以9 + 1變成91)..我沒有知道爲什麼它只是發生了9,而不是5

所以按照我的意見代碼變得

<xsl:template name="for.loop"> 

    <xsl:param name="i" /> 
    <xsl:param name="count" /> 

    <xsl:if test="number($i) &lt;= number($count)"> 
    <colspec colname="{concat('c',$i)}"/> 
    </xsl:if> 

    <xsl:if test="number($i) &lt;= number($count)"> 
    <xsl:call-template name="for.loop"> 
     <xsl:with-param name="i"> 
     <xsl:value-of select="number($i) + 1"/> 
     </xsl:with-param> 
     <xsl:with-param name="count"> 
     <xsl:value-of select="$count"/> 
     </xsl:with-param> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

另外,你正在做同樣的測試在一排,你應該能夠只是刪除線

</xsl:if> 

    <xsl:if test="number($i) &lt;= number($count)">