XSLT中拆分换行分隔文本实现增量计数器的方法
XSLT 拆分文本并生成递增序号的实现方案
核心逻辑说明
你当前编写的模板存在两处核心问题:
- 仅通过
substring-before抓取了分隔符前的第一个片段,没有遍历处理所有拆分后的内容块 - XSLT 没有可修改值的可变变量,无法直接实现静态占位符
my-count-here的自增效果,需要结合版本对应的原生能力/递归传参实现计数器
方案1:XSLT 2.0/3.0 场景(简化实现)
高版本XSLT原生提供字符串拆分函数tokenize,可以直接把拆分后的片段序列通过for-each遍历,利用position()内置属性直接作为从1开始的递增序号,不需要手动写递归逻辑:
<xsl:template match="root"> <xsl:param name="delimiter" select="' '"/> <!-- 按指定分隔符拆分text内容,过滤空片段避免无效输出 --> <xsl:for-each select="tokenize(text, $delimiter)[normalize-space(.) != '']"> <xsl:value-of select="position()"/> <xsl:text> </xsl:text> <xsl:value-of select="."/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template>
运行后直接匹配预期输出效果,自定义分隔符时只需要修改delimiter参数的值即可。
方案2:XSLT 1.0 场景(兼容实现)
低版本XSLT没有tokenize函数,需要通过递归模板实现拆分逻辑,将计数器作为模板参数随每次递归传递,每次处理完一个片段就把计数值+1传入下一轮递归:
<xsl:template match="root"> <xsl:param name="delimiter" select="' '"/> <!-- 初始化递归参数:全量文本、分隔符、起始计数值1 --> <xsl:call-template name="split-content-with-count"> <xsl:with-param name="raw-content" select="text"/> <xsl:with-param name="delimiter" select="$delimiter"/> <xsl:with-param name="current-index" select="1"/> </xsl:call-template> </xsl:template> <xsl:template name="split-content-with-count"> <xsl:param name="raw-content"/> <xsl:param name="delimiter"/> <xsl:param name="current-index"/> <!-- 拼接分隔符兜底,避免丢失末尾没有分隔符的最后一个片段 --> <xsl:variable name="current-token" select="substring-before(concat($raw-content, $delimiter), $delimiter)"/> <!-- 仅当片段非空时输出,避免连续换行产生空行 --> <xsl:if test="normalize-space($current-token) != ''"> <xsl:value-of select="$current-index"/> <xsl:text> </xsl:text> <xsl:value-of select="$current-token"/> <xsl:text> </xsl:text> <!-- 递归处理剩余内容,计数自增1 --> <xsl:call-template name="split-content-with-count"> <xsl:with-param name="raw-content" select="substring-after($raw-content, $delimiter)"/> <xsl:with-param name="delimiter" select="$delimiter"/> <xsl:with-param name="current-index" select="$current-index + 1"/> </xsl:call-template> </xsl:if> </xsl:template>
常见注意点
- 不要尝试在XSLT里“修改”已经定义的变量值,XSLT的变量是单次赋值的常量,自增逻辑必须通过参数传递的方式实现
- 拼接
delimiter的兜底逻辑是必要的,否则当文本最后一个片段后没有跟分隔符时,最后一段内容会被遗漏 - 过滤空片段的判断逻辑可以根据实际场景调整,比如需要保留空行时去掉对应的过滤条件即可。
内容的提问来源于stack exchange,提问作者mrrsb
相关产品推荐
相关产品推荐

