如何在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 <= $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
相关产品推荐
相关产品推荐

