XSL新手求助:如何根据Quantity值实现递归循环
解决XSL中根据Quantity递归循环输出Name的问题
嘿,刚接触XSL就敢啃发货软件模板的活儿,还搞定了大部分需求,已经超棒了!针对你说的「根据$order/Item/Quantity的值循环输出对应次数的Name」这个问题,我给你两种实用的解决方案,适配不同的XSLT版本:
方法一:递归模板(XSLT 1.0/2.0通用,适合旧系统)
XSLT 1.0没有原生的循环次数控制,递归是最常用的实现方式。核心思路是写一个递归模板,每次输出一条Name,然后把剩余循环次数减1,直到次数为0停止。
假设你的XML结构大概是这样(方便对应):
<Order> <Item> <Name>商品A</Name> <Quantity>3</Quantity> </Item> <Item> <Name>商品B</Name> <Quantity>2</Quantity> </Item> </Order>
对应的XSL模板代码:
<!-- 主入口模板,遍历所有Item --> <xsl:template match="/"> <xsl:apply-templates select="Order/Item"/> </xsl:template> <!-- 处理单个Item,调用递归模板 --> <xsl:template match="Item"> <xsl:call-template name="repeat-item"> <!-- 传递当前Item节点 --> <xsl:with-param name="current-item" select="."/> <!-- 传递初始循环次数(转成数字避免字符串问题) --> <xsl:with-param name="remaining-count" select="number(Quantity)"/> </xsl:call-template> </xsl:template> <!-- 核心递归模板:负责循环输出Name --> <xsl:template name="repeat-item"> <xsl:param name="current-item"/> <xsl:param name="remaining-count" select="1"/> <!-- 默认值兜底 --> <!-- 只要剩余次数>0,就输出Name并继续递归 --> <xsl:if test="$remaining-count > 0"> <!-- 这里替换成你实际需要输出的格式,比如包裹成对应的标签 --> <OrderLine> <xsl:value-of select="$current-item/Name"/> </OrderLine> <!-- 递归调用自己,剩余次数减1 --> <xsl:call-template name="repeat-item"> <xsl:with-param name="current-item" select="$current-item"/> <xsl:with-param name="remaining-count" select="$remaining-count - 1"/> </xsl:call-template> </xsl:if> </xsl:template>
方法二:直接范围循环(XSLT 2.0+,更简洁)
如果你的系统支持XSLT 2.0或更高版本(比如用Saxon处理器),可以直接用1 to Quantity生成数字范围,配合xsl:for-each实现循环,代码更简洁:
<xsl:template match="/"> <xsl:for-each select="Order/Item"> <!-- 保存当前Item的引用,避免内部循环时路径丢失 --> <xsl:variable name="item" select="."/> <!-- 循环次数从1到Quantity的数值 --> <xsl:for-each select="1 to number(Quantity)"> <OrderLine> <xsl:value-of select="$item/Name"/> </OrderLine> </xsl:for-each> </xsl:for-each> </xsl:template>
注意事项
- 一定要用
number(Quantity)把Quantity转成数值类型,避免因为它是字符串导致减法、比较逻辑出错; - 如果你的XML里Quantity可能是0或者负数,模板里的
<xsl:if test="$remaining-count > 0"已经帮你处理了这种情况,不会输出空内容; - 替换代码里的
<OrderLine>为你实际需要的输出标签格式就行。
内容的提问来源于stack exchange,提问作者user9528737
相关产品推荐
相关产品推荐

