Ошибка в цикле for в xslt - PullRequest
       10

Ошибка в цикле for в xslt

0 голосов
/ 24 августа 2011

У меня есть цикл for в одном из моих файлов 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, обслуживающей создание "Colspec""узлы модели таблицы Cals.Параметр, который я передаю ему, это просто индекс существа, который должен быть 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>

Странно то, что я достиг точки, где "$ value" равно 9, атрибут 9 назначен правильно для "@cols", но узлы "Colspecs" были созданы 89 раз!Однако, когда я пробую другой документ, когда «$ value» равно 5, оба параметра «@cols» и #of «Colspecs» верны.

Я заблудился здесь, почему цикл for будет повторяться 89раз, когда фактический счет просто 9?

1 Ответ

1 голос
/ 25 августа 2011

Убедитесь, что вы используете все числовые переменные в числовой функции, когда используете их, так как я предполагаю, что где-то ваш синтаксический анализатор обрабатывает их как строки и выполняет конкатенацию (так что 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)"> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...