2012-04-25 14 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をテストすることで、シーケンスの最初の項目をいつ処理しているかを知ることができます。

関連する問題