2012-04-25 4 views
22

저는 XSLT에 익숙하지 않으며 잘못된 각도에서 제 문제를보고있을 수도 있습니다. C++ 및 Java와 같은 언어에서 왔습니다. 누군가가 나를 도울 수 있기를 바랍니다.XSLT에서 첫 번째 루프 실행을 인식합니다.

XSLT에서 루프 호출 (xsl : for-each)을 만들고 첫 번째 루프에서 특정 작업을 루프를 통해 실행하려고합니다. 다른 언어에서는 이것에 상태 변수를 사용 하겠지만 변수는 XSLT에서 값을 변경할 수 없으므로이 문제를 어떻게 해결할 수 있습니까? 여기 내가하고 싶은 것이있다. if 절의 대문자 부분은 물론 가짜이며 내 문제를 나타냅니다.

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

감사합니다. Henrik

답변

36

가장 쉬운 방법은 현재 노드의 위치를 ​​확인하는 것입니다. 또한 트리에서 값을 요소를 이전의 존재를 확인하는 것보다 빠르다 (및 xsl:sort 루프에 추가 된 경우 여전히 작동됩니다) :

<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

이제 어떻게 할 수 있습니까? 절차로 생각하는 것을 멈추고 더 재귀 적으로 생각해야합니다. (수정)

가 처음 인 경우

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

즉, 그 전에 아무 것도 없습니다. 그러나 루프 외부에서 다른 방법을 사용할 수도 있습니다.

+0

노드 집합을 만들고이를 반복하는 등 상황에 따라 다른 방법이 있습니다. 등 위치 수 계산 ... 키는 절차 언어와 같은 방식으로 루프를 생각하지 않는 것입니다 – Woody

+0

빠른 답변을 제공해 주셔서 감사합니다. 그게 해결 됐어! – Henrik

+0

@Woody 이것은 위대한 사람입니다! 정확히 내가 무엇을 찾고 있었는지. –

3

봅니다 "시간"의 사고를 방지 할 수 있습니다. XSLT 실행이 정시에 정렬되지 않기 때문에 처음에는 없습니다. 그러나 입력 시퀀스에는 첫 번째 항목이 있으며 position() = 1을 테스트하여 시퀀스의 첫 번째 항목을 처리하는 시점을 알 수 있습니다.

관련 문제