Индекс в цикле XSL
У меня есть два вложенных цикла в XSL, как это, в данный момент я использую position(), но это не то, что мне нужно.
<xsl:for-each select="abc">
<xsl:for-each select="def">
I wanna my variable in here increasing fluently 1,2,3,4,5.....n
not like 1,2,3,1,2,3
</xsl:for-each>
</xsl:for-each>
Можете ли вы дать мне некоторое представление об этом заглушке. Большое вам спасибо!
Ответы
Ответ 1
С XSL проблема заключается в том, что вы не можете изменить переменную (она больше похожа на константу, которую вы настраиваете). Таким образом, приращение переменной счетчика не работает.
Неудобным обходным путем для получения последовательного счета (1,2,3,4,...) было бы вызов position() для получения итерации тега "abc", а другой вызов position() для получения вложенную итерацию тега "def" . Затем вам нужно будет умножить итерацию "abc" с количеством содержащихся в ней тегов "def" . Вот почему это "неуклюжий" обходной путь.
Предполагая, что у вас есть два вложенных тега "def" , XSL будет выглядеть следующим образом:
<xsl:for-each select="abc">
<xsl:variable name="level1Count" select="position() - 1"/>
<xsl:for-each select="def">
<xsl:variable name="level2Count" select="$level1Count * 2 + position()"/>
<xsl:value-of select="$level2Count" />
</xsl:for-each>
</xsl:for-each>
Ответ 2
Просто измените способ выбора элементов для цикла:
<xsl:for-each select="abc/def">
<xsl:value-of select="position()"/>
</xsl:for-each>
Если вам необходимо поддерживать вложенные циклы, подумайте о добавлении еще одного цикла, например:
<xsl:variable name="items" select="//abc/def"/>
<xsl:for-each select="abc">
<xsl:for-each select="def">
<xsl:variable name="id" select="generate-id()"/>
<xsl:for-each select="$items">
<xsl:if test="generate-id()=$id">
<xsl:value-of select="position()"/>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
Ответ 3
<xsl:for-each select="abc">
<xsl:variable name="i" select="position()"/>
<xsl:for-each select="def">
<xsl:value-of select="$i" />
</xsl:for-each>
</xsl:for-each>
Ответ 4
Это расширение ответа pythonquick, которое обрабатывает разные числа подэлементов:
<xsl:for-each select="abc">
<xsl:variable name="level1Position" select="position()"/>
<xsl:variable name="priorCount" select="count(../abc[position() < $level1Position]/def)"/>
<xsl:for-each select="def">
<xsl:variable name="level2Count" select="$priorCount + position()"/>
<xsl:value-of select="$level2Count" />
</xsl:for-each>
</xsl:for-each>
Input:
<root>
<abc>
<def>A</def>
<def>B</def>
<def>C</def>
</abc>
<abc>
<def>D</def>
<def>E</def>
</abc>
<abc>
<def>F</def>
</abc>
<abc>
<def>G</def>
<def>H</def>
<def>I</def>
</abc>
</root>