27

私はXSLTにかなり慣れていないので、問題を間違った角度から見ている可能性があります。C++やJavaなどの言語から来ています。誰かが私を助けてくれることを願っています。

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>

どうもありがとう!ヘンリック

4

3 に答える 3

44

最も簡単な方法は、現在のノードの位置を確認することだと思います。また、ツリー内の先行する値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>
于 2012-04-25T15:31:49.227 に答える
3

「時間」を考えないようにしてください。XSLTの実行は時間内に順序付けられていないため、初回はありません。ただし、入力シーケンスには最初の項目があり、position()= 1をテストすることで、シーケンスの最初の項目をいつ処理しているかを知ることができます。

于 2012-04-25T17:42:40.707 に答える
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>

つまり、それが最初の場合、その前には何もありません。ただし、ループの外でそれを行う他の方法があるかもしれません

于 2012-04-25T15:03:25.887 に答える