индекс в цикле XSL - PullRequest
       14

индекс в цикле XSL

15 голосов
/ 30 мая 2009

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

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

Ответы [ 4 ]

22 голосов
/ 30 мая 2009

С 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>
6 голосов
/ 06 апреля 2011

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

<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>
5 голосов
/ 30 мая 2009
<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>
1 голос
/ 12 сентября 2011

Это расширение ответа 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...