Увеличение значения в 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>
Если кто-нибудь может просветить меня о том, есть ли альтернативный способ сделать это
Благодаря
Ответы
Ответ 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
(см. другие ответы) может быть проще, если все, что вы хотите сделать, это переменное приращение. Используйте описанную здесь рекурсию, если вы хотите более сложный цикл/условие.