2008-09-18 33 views
80

Cách nhận bộ đếm trong vòng lặp xsl: for-each sẽ phản ánh số lượng phần tử hiện tại được xử lý.
Ví dụ nguồn XML của tôi làSố lượt truy cập bên trong vòng lặp xsl: for-each

<books> 
    <book> 
     <title>The Unbearable Lightness of Being </title> 
    </book> 
    <book> 
     <title>Narcissus and Goldmund</title> 
    </book> 
    <book> 
     <title>Choke</title> 
    </book> 
</books> 

Những gì tôi muốn nhận được là:

<newBooks> 
    <newBook> 
     <countNo>1</countNo> 
     <title>The Unbearable Lightness of Being </title> 
    </newBook> 
    <newBook> 
     <countNo>2</countNo> 
     <title>Narcissus and Goldmund</title> 
    </newBook> 
    <newBook> 
     <countNo>3</countNo> 
     <title>Choke</title> 
    </newBook> 
</newBooks> 

Các XSLT để sửa đổi:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
     <newBooks> 
      <xsl:for-each select="books/book"> 
       <newBook> 
        <countNo>???</countNo> 
        <title> 
         <xsl:value-of select="title"/> 
        </title> 
       </newBook> 
      </xsl:for-each> 
     </newBooks> 
    </xsl:template> 
</xsl:stylesheet> 

Vì vậy, câu hỏi là những gì để đưa ra của ???. Có bất kỳ từ khóa chuẩn nào hay tôi chỉ đơn giản là phải khai báo một biến và tăng nó trong vòng lặp?

Như câu hỏi là khá dài tôi có lẽ nên mong đợi một dòng hoặc một từ câu trả lời :)

Trả lời

130

position(). Ví dụ .:

<countNo><xsl:value-of select="position()" /></countNo> 
+1

Cần thêm dấu ngoặc kép đóng "với giá trị thuộc tính –

+6

Đây là tất cả tiền phạt và dandy cho đến khi bạn phải thêm một bộ lọc như xsl: if bên trong xsl của bạn:. For-each Sau đó, vị trí() là vô ích và bạn cần truy cập thích hợp –

+2

@Mike Stavrov Đó không phải là một phần của câu hỏi! Không thể bao gồm mọi tình huống – redsquare

5
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
     <newBooks> 
       <xsl:for-each select="books/book"> 
         <newBook> 
           <countNo><xsl:value-of select="position()"/></countNo> 
           <title> 
             <xsl:value-of select="title"/> 
           </title> 
         </newBook> 
       </xsl:for-each> 
     </newBooks> 
    </xsl:template> 
</xsl:stylesheet> 
13

Hãy thử chèn <xsl:number format="1. "/><xsl:value-of select="."/><xsl:text> tại nơi ???.

Lưu ý "1." - đây là định dạng số. Thông tin thêm: here

+0

Cảm ơn, đó cũng là một điều thú vị. Tôi có thể sẽ sử dụng cách tiếp cận đó khi một số định dạng được yêu cầu – kristof

+0

Phiên bản XSLT 1.0: '' – jsuddsjr

5

Hãy thử:

<xsl:value-of select="count(preceding-sibling::*) + 1" /> 

Sửa - có một bộ não đóng băng ở đó, vị trí() là đơn giản hơn!

+1

Vẫn còn có thể hữu ích, đặc biệt nếu bạn chọn dựa trên các tiêu chí khác ngoài vị trí(). +1 – jsuddsjr

5

Bạn cũng có thể chạy câu lệnh có điều kiện trên Postion() có thể thực sự hữu ích trong nhiều trường hợp.

ví dụ:

<xsl:if test="(position()) = 1"> 
    //Show header only once 
    </xsl:if> 
+1

Điều này không thành công nếu bạn có bộ lọc như xsl: sort vì mục đầu tiên có thể không phải là mục đầu tiên được xử lý. –

Các vấn đề liên quan