【问题标题】:Loop xslt template循环 xslt 模板
【发布时间】:2011-06-09 23:44:20
【问题描述】:

我知道周围有类似的、更复杂的帖子,但我就是无法让这个简单的事情发挥作用。我有一个非常简单的 XSLT 循环,我只需要运行 5 次。就是这样。

这是我所拥有的:

<xsl:template match="/">
  <div id="container">
    <xsl:for-each select="$currentPage/myItems/data/item">
      <img src="image.gif" />
    </xsl:for-each>
  </div>
</xsl:template>

这很好,我只需要循环这部分:

    <xsl:for-each select="$currentPage/myItems/data/item">
      <img src="image.gif" />
    </xsl:for-each>

五次以上,因此输出实际上只是重复了 5 次。我不想只是复制和粘贴五次(尽管这确实有效),因为必须有更好的方法来处理它。

谁能指出我正确的方向?谢谢!

【问题讨论】:

    标签: xslt loops


    【解决方案1】:

    从技术上讲,XSLT 旨在转换数据;循环预定次数将更符合生成数据。不幸的是,适当的方法是复制并粘贴 5 次。

    另外,您问这个问题的时间可能比复制和粘贴所花费的时间要多:)

    【讨论】:

      【解决方案2】:

      XSLT 中唯一的命令式循环结构是for-each,但它会循环输入文档中的节点。如果不想使用递归来实现,把循环的内部放在一个命名模板中,然后使用call-template 5次调用。

      类似:

      <xsl:template name='inside-loop'>
        <xsl:for-each select="$currentPage/myItems/data/item">
          <img src="image.gif" />
        </xsl:for-each>
      </xsl:template>
      

      然后你想在哪里调用它:

      <xsl:call-template name='inside-loop' />
      

      【讨论】:

      • 这就是我一直在尝试的,但我无法理解 XSLT,而且我尝试过的任何方法都不起作用。它一定很简单,但我只是错过了这条线的某个地方。
      • @Dan:哎呀,是call-template,也展开了。
      • 谢谢 - 所以我不能把那个 放到一个循环中 - 我实际上只需要粘贴 5 次?
      • @Dan:正确(除非您想使用递归和其他模板)。
      【解决方案3】:

      对不起,但是使用有什么区别:

      <xsl:template match="/">
        <div id="container">
          <xsl:for-each select="$currentPage/myItems/data/item">
            <img src="image.gif" />
            <img src="image.gif" />
            <img src="image.gif" />
            <img src="image.gif" />
            <img src="image.gif" />
          </xsl:for-each>
        </div>
      </xsl:template>
      

      或者,更好:

      <xsl:template match="/">
        <div id="container">
              <xsl:apply-templates select="$currentPage/myItems/data/item" mode="image"/>
        </div>
      </xsl:template>
      
      <xsl:template match="item" mode="image">
          <img src="image.gif" />
          <img src="image.gif" />
          <img src="image.gif" />
          <img src="image.gif" />
          <img src="image.gif" />
      </xsl:template>
      

      【讨论】:

        【解决方案4】:

        在 XSLT 2.0 中,您可以:

        <xsl:for-each select="1 to $n">
           ....
        </xsl:for-each>
        

        在 1.0 中,您有一个选择:您可以使用递归(模板调用自身并传递一个计数作为参数,并在计数降至零时终止);或者您可以使用解决方法

        <xsl:for-each select="(//node())[position() &lt;= $n]">
        

        如果您的文档中有超过 $n 个节点。

        当然,正如其他人所指出的,如果 $n 永远是 5,那么你可以复制代码 5 次。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-15
          • 1970-01-01
          • 1970-01-01
          • 2012-07-25
          • 2012-01-07
          • 2013-09-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多