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>
Вы можете использовать функцию 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>
Я сам столкнулся с этим два года назад. Для этого вам нужно использовать рекурсию. Я забыл точный синтаксис, но этот сайт может помочь:
Совет: Цикл с рекурсией в XSLT
Стратегия в основном работает следующим образом: Замените для
цикла шаблонным «методом». Получите параметр 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
(см. Другие ответы) может быть проще, если все вы хочу сделать, это иметь переменный приращение. Используйте описанный здесь вид рекурсии, если вам нужен более сложный цикл / условие.