You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在XSLT 1.0中按指定次数循环调用模板?

用XSLT递归模板实现指定次数的循环输出

核心思路是通过递归模板实现循环:从第1次开始,每次处理当前循环索引,判断是否存在对应位置的电影,不存在则输出提示,直到循环索引超过指定的总次数为止。

示例代码实现

1. 电影数据XML(movies.xml)

<movies>
  <movie>
    <title>星际穿越</title>
  </movie>
  <movie>
    <title>盗梦空间</title>
  </movie>
</movies>

2. PHP传递参数(showMovies.php)

通过XSLTProcessor将GET参数countMovie传递给XSLT:

<?php
$xml = new DOMDocument();
$xml->load('movies.xml');

$xsl = new DOMDocument();
$xsl->load('movies.xsl');

$proc = new XSLTProcessor();
$proc->importStylesheet($xsl);
// 接收GET参数,默认值设为2
$count = isset($_GET['countMovie']) ? intval($_GET['countMovie']) : 2;
$proc->setParameter('', 'countMovie', $count);

echo $proc->transformToXML($xml);
?>

3. 核心XSLT代码(movies.xsl)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 接收PHP传递的循环次数参数 -->
  <xsl:param name="countMovie" select="2"/>

  <!-- 主入口模板,启动递归循环 -->
  <xsl:template match="/">
    <xsl:call-template name="movie-loop">
      <xsl:with-param name="current-index" select="1"/>
    </xsl:call-template>
  </xsl:template>

  <!-- 递归循环模板 -->
  <xsl:template name="movie-loop">
    <xsl:param name="current-index"/>

    <!-- 终止条件:当前索引超过指定次数时停止递归 -->
    <xsl:if test="$current-index &lt;= $countMovie">
      <!-- 获取当前索引对应的电影节点(XPath节点索引从1开始) -->
      <xsl:variable name="current-movie" select="/movies/movie[$current-index]"/>

      <xsl:choose>
        <xsl:when test="$current-movie">
          <p><xsl:value-of select="$current-movie/title"/></p>
        </xsl:when>
        <xsl:otherwise>
          <p>No more movie</p>
        </xsl:otherwise>
      </xsl:choose>

      <!-- 递归调用,索引+1 -->
      <xsl:call-template name="movie-loop">
        <xsl:with-param name="current-index" select="$current-index + 1"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

关键注意点

  • XPath的节点索引是从1开始的,所以直接用$current-index匹配对应位置的电影节点即可
  • 必须设置递归终止条件($current-index <= $countMovie),否则会陷入无限递归
  • 参数传递要确保countMovie是数值类型,PHP中用intval()转换避免字符串干扰

当countMovie=5时,输出结果会是:

星际穿越

盗梦空间

No more movie

No more movie

No more movie

内容的提问来源于stack exchange,提问作者Anno123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:50:25