2009-05-30 27 views
14

Tôi có hai vòng lặp lồng nhau trong XSL như thế này, tại thời điểm này tôi sử dụng vị trí() nhưng nó không phải là những gì tôi cần.chỉ số trong vòng 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> 

Bạn có thể cho tôi một số ý tưởng cho bài này không. Cảm ơn nhiều!

Trả lời

18

Với XSL, vấn đề là bạn không thể thay đổi biến (nó giống như hằng số bạn đang đặt). Vì vậy, tăng một biến truy cập không hoạt động.

Một cách giải quyết vụng về để nhận được số đếm tuần tự (1,2,3,4, ...) sẽ gọi đến vị trí() để nhận lại thẻ "abc" và một cuộc gọi khác đến vị trí() để nhận lặp lại thẻ "def" lồng nhau. Sau đó, bạn sẽ cần phải nhân lặp lại "abc" với số lượng thẻ "def" mà nó chứa. Đó là lý do tại sao đây là giải pháp "vụng về".

Giả sử bạn có hai lồng nhau "def" thẻ, XSL sẽ trông như sau:

<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

Cảm ơn bạn rất nhiều pythonquick, bạn code làm việc tốt cho tôi! Tôi mất rất nhiều thời gian. Cảm ơn bạn! – gacon

+0

Lưu ý rằng thao tác này sẽ chỉ hoạt động nếu mọi 'abc' có số con bằng nhau. Ngoài ra, điều này chỉ hoạt động với số lượng 'def' được mã hóa cứng. – jelovirt

+0

Rất hữu ích! Tôi đã thêm một câu trả lời bổ sung hoạt động cho một số lượng biến 'def' con. –

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

này sẽ không tạo ra một 1,2,3,4, ... Chuỗi trừ khi có chỉ là một lồng nhau "def" trong thẻ "abc". – pythonquick

+0

Cảm ơn bạn Chris Doggett nhưng vấn đề của tôi là khi tôi sử dụng position() trong vòng lặp thứ hai bên trong nó tiếp tục từ rezo không phải bởi chỉ số cuối cùng trong vòng lặp đầu tiên. Vì vậy, tôi không thể sử dụng đề xuất của bạn! Nhưng đề xuất của bạn có thể hữu ích cho tôi gần đây, cảm ơn Chris lần nữa! – gacon

6

Chỉ cần thay đổi cách thức để chọn các mục để lặp qua:

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

nên bạn đặc biệt cần phải giữ vòng lặp lồng nhau, hãy cân nhắc thêm một vòng lặp khác như sau:

<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

Đây là phần mở rộng ension của câu trả lời pythonquick của xử lý số khác nhau của các phần tử con:

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

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> 
Các vấn đề liên quan