XSL - почему это вечно повторяется? - PullRequest
2 голосов
/ 23 октября 2010

Я пытаюсь создать нечто похожее на цикл for с рекурсивной идиомой, которую я видел в Интернете.Моя реализация с параметром, который говорит, что печатать.Я использую встроенный XSL-преобразователь Eclipse и не могу понять, почему он дает StackOverflowException:

<!-- 
    Loops recursively to print something the number of times specified with 
    the max parameter. 
    The print parameter tells what to print.
-->
<xsl:template name="loop">
    <xsl:param name="count" select="1"/>
    <xsl:param name="max" />
    <xsl:param name="print" />
    <xsl:if test="not($count = $max)">

        <xsl:value-of select="$print" />

        <xsl:call-template name="loop">
            <xsl:with-param name="count">
                <xsl:value-of select="$count + 1" />
            </xsl:with-param>
            <xsl:with-param name="max">
                <xsl:value-of select="$max"/>
            </xsl:with-param>
            <xsl:with-param name="print">
                <xsl:value-of select="$print" />
            </xsl:with-param>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

Кроме того, почему $count < $max дает недопустимое выражение Xpath?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 23 октября 2010

Не могу понять, почему это дает исключение StackOverflowException

Проверка на "стоп" в коде слишком слабая :

<xsl:if test="not($count = $max)">      

Это всегда будет true(), если $max меньше $count, , если один или оба из $max и $count не имеют целочисленных значений, илиесли они не определены.

Кроме того, почему $ count <$ max дает недопустимое выражение Xpath? </p>

Вы можете использовать :

not($count >= $max)

и, таким образом, избегайте необходимости экранировать символ <.

Наконец , еще одна проблема, не связанная напрямую с основной проблемой:

Никогда не указывайте (атомарное) значение параметра в теле <xsl:with-param>, <xsl:param> или <xsl:variable>.Это создает RTF (Result Tree Fragment) и требует преобразования в правильное атомарное значение при каждой ссылке на параметр / переменную.Это неэффективно, трудно читать и поддерживать и может привести к ошибкам.

Вместо :

        <xsl:with-param name="count">               
            <xsl:value-of select="$count + 1" />               
        </xsl:with-param>               

write :

        <xsl:with-param name="count" select="$count + 1" />               
3 голосов
/ 23 октября 2010

Кроме того, почему $ count <$ max дает неверное выражение Xpath? </p>

Вы должны использовать &lt; вместо < символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...