Распознать первый цикл в 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>
Спасибо большое!
Хенрик
Ответы
Ответ 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>
т.е. если он первый, перед ним ничего не будет. Однако могут быть другие способы сделать это за пределами цикла