2012-04-25 31 views
22

Tôi khá mới đối với XSLT và có thể xem xét vấn đề của tôi từ góc sai - đến từ các ngôn ngữ như C++ và Java. Tôi hy vọng ai đó có thể giúp tôi.Nhận dạng vòng lặp đầu tiên chạy trong XSLT

Tôi muốn thực hiện cuộc gọi vòng lặp (xsl: for-each) trong XSLT và thực hiện điều gì đó cụ thể trong lần chạy đầu tiên thông qua vòng lặp. Trong các ngôn ngữ khác, tôi sẽ sử dụng biến trạng thái cho điều này, nhưng các biến không thể thay đổi giá trị của chúng trong XSLT như tôi đã học được, vậy làm thế nào tôi có thể giải quyết vấn đề này? Đây là những gì tôi muốn làm. Phần phía trên của mệnh đề if dĩ nhiên là giả và đại diện cho vấn đề của tôi.

<xsl:for-each select="browser/value"> 
<xsl:if test="FIRST TIME IN LOOP"> 
    do something once 
</xsl:if> 

<xsl:value-of select="current()" /> 
</xsl:for-each> 

Cảm ơn rất nhiều! Henrik

Trả lời

36

Tôi nghĩ cách dễ nhất là kiểm tra vị trí của nút hiện tại. Nó cũng nhanh hơn so với kiểm tra sự tồn tại của trước giá trị yếu tố trong cây (và vẫn sẽ làm việc nếu xsl:sort được thêm vào vòng lặp):

<xsl:for-each select="browser/value"> 
    <xsl:if test="position()=1"> 
    do something here 
    </xsl:if> 
    <xsl:value-of select="blah"/> 
</xsl:for-each> 
2

Đó là cách bạn làm điều đó - bạn cần phải ngừng suy nghĩ như một quy trình và bắt đầu suy nghĩ theo cách đệ quy hơn.

(sửa đổi)

<xsl:for-each select="browser/value"> 
     <xsl:if test="not(preceding::value[parent::browser])"> 
       first post! 
     </xsl:if> 
     <xsl:value-of select="blah"/> 
    </xsl:for-each> 

tức là, nếu nó là người đầu tiên, sẽ có gì trước khi nó. Tuy nhiên, có thể có các cách khác để thực hiện điều đó ngoài vòng lặp

+0

Có nhiều cách khác, tùy thuộc vào ngữ cảnh, chẳng hạn như tạo các tập hợp nút và trao đổi thông qua chúng, tính toán vị trí của bạn, v.v. Điều quan trọng là không nghĩ về vòng lặp giống như ngôn ngữ thủ tục – Woody

+0

Cảm ơn rất nhiều vì câu trả lời nhanh. Điều đó giải quyết nó! – Henrik

+0

@Woody Đây là người đàn ông tuyệt vời! Chính xác những gì tôi đang tìm kiếm. –

3

Cố gắng tránh suy nghĩ của "thời gian". Không có lần đầu tiên, vì việc thực thi XSLT không được sắp xếp đúng lúc. Nhưng có một mục đầu tiên trong chuỗi đầu vào và bạn có thể biết khi nào bạn đang xử lý mục đầu tiên trong chuỗi bằng cách kiểm tra vị trí() = 1.

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