XSLT定义两个同名counter变量能否正确生成三位递增序号?
问题结论
你当前的写法无法实现预期的三位递增序号输出,存在3个核心错误:
- XSLT的变量是只读不可变的,for-each内部声明的同名
counter是循环体局部作用域的全新变量,不会修改外层根模板定义的counter值;且该局部变量声明在<xsl:value-of>输出逻辑之后,当前循环迭代中根本不会被前面的输出逻辑引用,所有迭代最终只会输出外层固定的001。 - 循环内递增逻辑写的
number(counter)+1没有给变量名加$前缀,不会引用你定义的counter变量,只会尝试匹配当前上下文节点下名为counter的XML子节点,逻辑本身无效。 - 就算数值递增逻辑正常,直接输出数字也不会自动补前导零,无法得到
001/002这类三位固定长度的格式。
正确实现方案
XSLT原生提供了迭代位置函数,不需要手动维护计数器,直接用position()获取当前循环从1开始的序号,配合格式化函数补前导零即可,代码如下:
<xsl:template match="/"> <xsl:for-each select="ns0:Notes/ns0:Note"> <ORDER_LINE_NOTE_SEG> <NOTLIN> <xsl:value-of select="format-number(position(), '000')"/> </NOTLIN> </ORDER_LINE_NOTE_SEG> </xsl:for-each> </xsl:template>
说明:
format-number()的第二个参数'000'代表固定输出三位数字,不足三位时自动在前面补0,完全匹配你需要的序号格式。如果你的环境是XSLT 2.0+版本,也可以用format-integer(position(), '000')实现完全相同的效果。
内容的提问来源于stack exchange,提问作者unknown09
相关产品推荐
相关产品推荐

