Нумеруйте узлы в конце вложенного <xsl: for-each> - PullRequest
1 голос
/ 12 января 2010

У меня есть XSLT-преобразование с несколькими вложенными <xsl:for-each> и <xsl:apply-templates>.

Теперь мне нужно нумеровать узлы в конце этого для каждого и применять шаблоны. Все, что я пробовал, просто пронумеровало итерации на уровне for-each (например, 1,2,3,4,1,2,1,2,3,4, но мне нужно 1,2,3,4,5,6, 7,8,9,10)

( Я довольно неопытен с XSLT, но попытался решить эту проблему с различными вариантами <xsl:number> и position(). )

test.xml

<A>
    <B>
        <C/>
        <C/>
        <C/>
        <C/>
    </B>
    <B>
        <C/>
        <C/>
    </B>
</A>

text.xsl:

<xsl:template match="A">
    <xsl:for-each select="B">
        <xsl:for-each select="C">
            <xsl:number/>,
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

test.out

1,2,3,4,1,2,

Я бы хотел иметь

1,2,3,4,5,6

EDIT : Этот пример прост, он работает с <xsl:number level="any" />. Сначала я должен сделать лучший пример

Ответы [ 3 ]

3 голосов
/ 12 января 2010
<xsl:number value="count(preceding::C) + 1"/><xsl:if test="following::C">,</xsl:if>

(или что-то подобное) должно это сделать.

1 голос
/ 12 января 2010

Попробуйте:

<xsl:template match="A/B/C">
  <xsl:value-of select="position()" />
</xsl:template>

position() всегда возвращает позицию текущего узла в пакете узлов, который обрабатывается в данный момент. Ваше решение:

<xsl:template match="A">
  <xsl:for-each select="B">
    <xsl:for-each select="C">
      <xsl:number/>,
    </xsl:for-each>
  </xsl:for-each>
</xsl:template>

Обрабатывает четыре пакета узлов:

  • Одна партия <A> узлов. Они переходят из положения 1 в 1.
  • Одна партия <B> узлов. Они переходят из положения 1 в 2.
  • Две партии <C> узлов. Они выходят из положения 1-4 и 1-2

Пока мое решение обрабатывает, выбирая их напрямую:

  • Одна партия из <C> узлов. Они выходят из положения 1-6
0 голосов
/ 12 января 2010

Вы можете увеличить переменную:

<xsl:template match="A">
    <xsl:variable name="count" select="1"/>
    <xsl:for-each select="B">
        <xsl:for-each select="C">
            <xsl:variable name="count" select="$count + 1"/>
            <xsl:value-of select="count" />,
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...