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

XSLT 1.0 根据XML字段值循环调用模板打印条码标签求助

XSLT按指定次数循环生成条码解决方案

你当前的代码主要存在三个可修正的问题:

  • 命名模板的name属性不能直接写XPath匹配路径,匹配节点的match属性和供调用的命名模板name属性是完全独立的两个配置,你需要给递归用的模板单独设置名称
  • 初始参数的取值路径冗余,你已经匹配到Order/OrderLine节点,直接读取当前节点下的Quantity字段即可,避免误取到其他订单行的数值
  • 没有做类型转换,如果Quantity字段读取到的是字符串格式的数字,直接做数值运算可能会报错,建议提前转成数字类型

修正后的代码如下:

<!-- 匹配订单行节点,触发循环逻辑 -->
<xsl:template match="//Order/OrderLine">
    <!-- 读取当前订单行的数量作为循环初始值,转成数字类型 -->
    <xsl:call-template name="printLabelLoop">
        <xsl:with-param name="count" select="number(Product/Properties/Quantity)"/>
    </xsl:call-template>
</xsl:template>

<!-- 自定义命名模板,实现递归循环生成条码 -->
<xsl:template name="printLabelLoop">
    <xsl:param name="count"/>
    <xsl:if test="$count > 0">
        <!-- 这里放你原来生成条码标签的代码 -->
        <xsl:value-of select="$count"/>
        
        <!-- 递归调用,次数减1 -->
        <xsl:call-template name="printLabelLoop">
            <xsl:with-param name="count" select="$count - 1"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

代码逻辑说明:

  • 先通过匹配Order/OrderLine节点获取当前订单行的上下文,读取Quantity值转成数字作为循环初始值
  • 单独定义命名模板printLabelLoop处理递归逻辑,每次调用先判断剩余次数大于0就生成一次条码,再把次数减1调用自身,直到次数为0终止
  • 如果你的XSLT版本是2.0及以上,还可以用更简洁的<xsl:for-each select="1 to xs:integer(Product/Properties/Quantity)">语法实现循环,不需要写递归逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:15:11