2009-05-30 7 views
14

Mam dwie pętle zagnieżdżone w XSL w ten sposób, w tej chwili używam position(), ale to nie jest to, czego potrzebuję.indeks w pętli XSL

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

Czy możesz dać mi pomysł na ten stub. Dziękuję Ci bardzo!

Odpowiedz

18

Z XSL problem jest nie można zmienić zmienną (jest bardziej przypomina stała, które ustawiasz). Tak więc zwiększanie zmiennej licznika nie działa.

Niezdecydowanym sposobem obejścia tego problemu (1,2,3,4, ...) byłoby wywołanie funkcji position() w celu uzyskania iteracji znacznika "abc", a także innego wywołania pozycji() w celu uzyskania zagnieżdżona iteracja tagu "def". Powinieneś wtedy pomnożyć iterację "abc" z liczbą zawartych w niej tagów "def". Dlatego jest to "niezdarne" rozwiązanie.

Zakładając masz dwie zagnieżdżone „def” tagi, XSL będzie wyglądać następująco:

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

Dziękuję bardzo Pythonquick, kod działa dobrze dla mnie! Zajęło mi dużo czasu. Dziękuję Ci! – gacon

+0

Należy zauważyć, że działa to tylko wtedy, gdy każdy 'abc' ma taką samą liczbę wadliwych elementów potomnych. Działa to również tylko z zakodowaną liczbą "def". – jelovirt

+0

Bardzo pomocna! Dodałem dodatkową odpowiedź, która działa dla zmiennej liczby dzieci 'def'. –

5
<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> 
+0

ten nie będzie produkować 1,2,3,4, ... sekwencja chyba jest tylko jedna zagnieżdżona "def" tag pod znacznikiem "abc". – pythonquick

+0

Dziękuję Chrisowi Doggettowi, ale moim problemem jest to, że kiedy używam position() w drugiej pętli wewnątrz, to kontynuuje od rezo nie przez ostatni indeks w pierwszej pętli. Więc nie mogłem użyć twojej sugestii! Ale twoja sugestia może ci się przydać ostatnio, jeszcze raz dziękuję Chris! – gacon

6

Wystarczy zmienić sposób, aby wybrać elementy do pętli na:

<xsl:for-each select="abc/def"> 
    <xsl:value-of select="position()"/> 
</xsl:for-each> 

trzeba specjalnie trzeba zachować zagnieżdżone pętle, rozważ dodanie kolejnej pętli podobnej do tej:

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

To jest ext ension odpowiedzi pythonquick że obsługuje różne liczby podrzędnych elementów:

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

Wejście:

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