Подтвердить что ты не робот

Увеличение значения в XSLT

Я достаточно новичок в xlst и не понимаю, есть ли способ сохранить значение и изменить его позже, например, увеличивая переменную в цикле.

Я немного озадачен тем, что не могу изменить значение a после того, как оно установлено, не имеет для меня смысла, делая его более постоянным.

Например, я хочу сделать что-то вроде этого:

<xsl:variable name="i" select="0" />
<xsl:for-each select="data/posts/entry">
    <xsl:variable name="i" select="$i + 1" />
    <!-- DO SOMETHING -->
</xsl:for-each>

Если кто-нибудь может просветить меня о том, есть ли альтернативный способ сделать это
Благодаря

4b9b3361

Ответ 1

XSLT - это функциональный язык, и, среди прочего, это означает, что переменные в XSLT являются неизменяемыми, и как только они определены, их значение не может быть изменено.

Вот как можно добиться такого же эффекта в XSLT:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
   <posts>
    <xsl:for-each select="data/posts/entry">
        <xsl:variable name="i" select="position()" />
        <xsl:copy>
         <xsl:value-of select="concat('$i = ', $i)"/>
        </xsl:copy>
    </xsl:for-each>
   </posts>
 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к следующему XML-документу:

<data>
 <posts>
  <entry/>
  <entry/>
  <entry/>
  <entry/>
  <entry/>
 </posts>
</data>

результат:

<posts>
    <entry>$i = 1</entry>
    <entry>$i = 2</entry>
    <entry>$i = 3</entry>
    <entry>$i = 4</entry>
    <entry>$i = 5</entry>
</posts>

Ответ 2

Вы можете использовать функцию position():

<xsl:for-each select="data/posts/entry">
  <xsl:text>
    Postion: '
  </xsl:text>
  <xsl:value-of select = "position()" />
  <xsl:text>
    '
  </xsl:text>
  <!-- DO SOMETHING -->
</xsl:for-each>

Ответ 3

Я столкнулся с этим сам два года назад. Для этого вам нужно использовать рекурсию. Я забываю точный синтаксис, но этот сайт может помочь:

Совет: цикл с рекурсией в XSLT

Стратегия работает в основном следующим образом: Замените цикл for шаблоном "метод". Получите его параметр i. Сделайте тело цикла for в методе шаблона. Если i > 0 снова вызовет метод шаблона (рекурсия) с параметром i - 1.

псевдокод:

for i = 0 to 10:
   print i

становится:

def printer(i):
   print i
   if i < 10:
      printer(i + 1)
printer(0)

Обратите внимание, что использование position() в xsl:for-each (см. другие ответы) может быть проще, если все, что вы хотите сделать, это переменное приращение. Используйте описанную здесь рекурсию, если вы хотите более сложный цикл/условие.