2008-09-18 4 views
80

처리되는 현재 요소의 수를 반영하는 xsl : for-each 루프 내에 카운터를 얻는 방법. 내가 얻고 싶은 것은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> 

입니다
예를 들어 내 소스 XML입니다 :

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

XSLT는 수정 :

그래서 문제는 장소에 넣어 것입니다
<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> 

의 ???. 표준 키워드가 있습니까? 아니면 단순히 변수를 선언하고 루프 내에서 증가시켜야합니까?

문제이기 때문에 꽤 오랫동안 아마 한 줄 또는 한 단어 대답 :

답변

130

position()를 기대한다. 예컨대 :

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

속성 값 –

+6

에 닫는 따옴표 "를 추가해야 당신이 XSL과 같은 필터를 추가 할 때까지 모든 벌금과 멋쟁이 : 만약 당신의 XSL 내부 :.에 대한-각각 다음 위치() 쓸모이며, –

+2

@Mike Stavrov 그 질문의 일부가 아니 었습니다! 모든 상황을 커버 할 수 없습니다 – 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

???의 장소에 <xsl:number format="1. "/><xsl:value-of select="."/><xsl:text>를 삽입하십시오.

"1"에 유의하십시오. 이것은 숫자 형식입니다. 더 많은 정보 : here

+0

감사합니다. 흥미로운 읽기입니다. 포맷팅이 필요할 때이 방법을 사용합니다. – kristof

+0

XSLT 1.0 버전 :'' – jsuddsjr

5

시도 :

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

편집 -) 뇌가 (이 위치를 동결했다가 더 간단합니다!

+1

여전히 특히 position() 이외의 기준에 따라 선택하는 경우 유용 할 수 있습니다. +1 – jsuddsjr

5

많은 시나리오에서 실제로 도움이 될 수있는 Postion()에서도 조건문을 실행할 수 있습니다.

예 :

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

xsl : sort와 같은 필터가있는 경우 첫 번째 항목이 처리되지 않을 수도 있기 때문에 실패합니다. –