Увеличить значение в XSLT - PullRequest
28 голосов
/ 27 июля 2010

Я довольно новичок в 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>

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

Ответы [ 3 ]

30 голосов
/ 27 июля 2010

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>
7 голосов
/ 27 июля 2010

Вы можете использовать функцию 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>
1 голос
/ 27 июля 2010

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

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

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