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

Распознать первый цикл в XSLT

Я новичок в XSLT и могу смотреть на свою проблему с неправильного угла - исходя из таких языков, как С++ и Java. Надеюсь, кто-то может мне помочь.

Я хочу сделать вызов цикла (xsl: for-each) в XSLT и сделать что-то конкретное при первом прогоне цикла. В других языках я бы использовал переменную статуса для этого, но переменные не могут изменить их значение в XSLT, как я узнал, так как я могу решить эту проблему? Вот что я хочу сделать. Верхняя часть в предложении if, конечно же, является поддельной и представляет мою проблему.

<xsl:for-each select="browser/value">
 <xsl:if test="FIRST TIME IN LOOP">
  do something once
 </xsl:if>

 <xsl:value-of select="current()" />
</xsl:for-each>

Спасибо большое! Хенрик

4b9b3361

Ответ 1

Я думаю, что самый простой способ - проверить положение текущего node. Это также быстрее, чем проверка существования предшествующих элементов значения в дереве (и будет работать, если xsl:sort добавлен в цикл):

<xsl:for-each select="browser/value">
  <xsl:if test="position()=1">
    do something here
  </xsl:if>
  <xsl:value-of select="blah"/>
</xsl:for-each>

Ответ 2

Старайтесь не думать о "времени". Нет первого раза, поскольку выполнение XSLT не упорядочено во времени. Но во входной последовательности есть первый элемент, и вы можете сказать, когда обрабатываете первый элемент в последовательности, проверяя position() = 1.

Ответ 3

Вот как вы это делаете - вам нужно перестать думать как о процедуре и начать думать более рекурсивно.

(модифицированный)

  <xsl:for-each select="browser/value">
      <xsl:if test="not(preceding::value[parent::browser])">
                first post!
      </xsl:if>
      <xsl:value-of select="blah"/>
  </xsl:for-each>

т.е. если он первый, перед ним ничего не будет. Однако могут быть другие способы сделать это за пределами цикла