Увеличьте значение в XSLT

28
задан DonutReply 27 July 2010 в 15:03
поделиться

3 ответа

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>
31
ответ дан 28 November 2019 в 03:34
поделиться

Вы можете использовать функцию 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>
7
ответ дан JohnB 28 November 2019 в 03:34
поделиться

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

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

1
ответ дан 28 November 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: