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

如何使用XSLT去除字符串中的重复字符?(以重复逗号处理为例)

解决XSLT中合并重复逗号分隔符的问题

我来帮你搞定这个重复逗号的问题!你的需求是把像some, , , , text这种带有任意数量重复逗号(带空格)的字符串,转换成some, text的格式,对吧?先说说你现有代码的问题,再给你一个靠谱的解决方案。

你的代码为什么没生效?

  1. 递归逻辑错误:你在递归调用remove-duplicate时,没有把string-replace-all处理后的新文本传进去,反而还是用原始的$text。这就导致每次递归都在处理同一个字符串,永远没法推进,要么死循环要么没效果。
  2. 匹配方向反了:你设置的$remove参数是' ,'(空格+逗号),但你的输入里重复的是, (逗号+空格),contains($text, $remove)根本检测不到要替换的内容,自然不会触发替换操作。

正确的递归解决方案(XSLT 1.0)

这个模板会把连续的目标分隔符(这里是, )合并成单个,不管重复多少次:

<xsl:template name="collapse-consecutive-delimiters">
  <xsl:param name="text" />
  <!-- 默认分隔符是逗号加空格,可根据需求修改 -->
  <xsl:param name="delimiter" select="', '" />
  
  <!-- 定义连续重复的分隔符:分隔符+分隔符 -->
  <xsl:variable name="double-delimiter" select="concat($delimiter, $delimiter)" />
  
  <xsl:choose>
    <!-- 如果文本里还有重复的分隔符,继续替换并递归 -->
    <xsl:when test="contains($text, $double-delimiter)">
      <xsl:call-template name="collapse-consecutive-delimiters">
        <!-- 把所有重复的分隔符替换成单个,传递新文本继续处理 -->
        <xsl:with-param name="text" select="translate($text, $double-delimiter, $delimiter)" />
        <xsl:with-param name="delimiter" select="$delimiter" />
      </xsl:call-template>
    </xsl:when>
    <!-- 没有重复分隔符了,返回最终结果 -->
    <xsl:otherwise>
      <xsl:value-of select="$text" />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

调用方式

直接传入你的目标字符串即可:

<xsl:call-template name="collapse-consecutive-delimiters">
  <xsl:with-param name="text" select="string(.)" />
  <!-- 如果你的分隔符是纯逗号(不带空格),把这里改成','即可 -->
  <xsl:with-param name="delimiter" select="', '" />
</xsl:call-template>

额外说明

如果你的输入里可能存在不带空格的连续逗号(比如some,,,,text),只需要把$delimiter参数改成',',模板就会自动合并所有连续的纯逗号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:22:53