You need to enable JavaScript to run this app. XSLT中拆分换行分隔文本实现增量计数器的方法
优惠活动
大模型
产品
解决方案
定价
更多

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="'&#10;'"/>
  <!-- 按指定分隔符拆分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>&#10;</xsl:text>
  </xsl:for-each>
</xsl:template>

运行后直接匹配预期输出效果,自定义分隔符时只需要修改delimiter参数的值即可。


方案2:XSLT 1.0 场景(兼容实现)

低版本XSLT没有tokenize函数,需要通过递归模板实现拆分逻辑,将计数器作为模板参数随每次递归传递,每次处理完一个片段就把计数值+1传入下一轮递归:

<xsl:template match="root">
  <xsl:param name="delimiter" select="'&#10;'"/>
  <!-- 初始化递归参数:全量文本、分隔符、起始计数值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>&#10;</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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 19:24:04