Вопрос

У меня есть два вложенных цикла в 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>

Можете ли вы дать мне какую-нибудь идею для этого заглушки?Большое вам спасибо!

Это было полезно?

Решение

С 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>

Другие советы

Просто измените способ выбора элементов для перебора:

<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>
<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>

Это расширение ответа pythonquick, которое обрабатывает разное количество подэлементов:

<xsl:for-each select="abc">  
    <xsl:variable name="level1Position" select="position()"/>
    <xsl:variable name="priorCount" select="count(../abc[position() &lt; $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>

Входные данные:

<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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top