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
相关产品推荐
相关产品推荐

