如何使用XSLT去除字符串中的重复字符?(以重复逗号处理为例)
解决XSLT中合并重复逗号分隔符的问题
我来帮你搞定这个重复逗号的问题!你的需求是把像some, , , , text这种带有任意数量重复逗号(带空格)的字符串,转换成some, text的格式,对吧?先说说你现有代码的问题,再给你一个靠谱的解决方案。
你的代码为什么没生效?
- 递归逻辑错误:你在递归调用
remove-duplicate时,没有把string-replace-all处理后的新文本传进去,反而还是用原始的$text。这就导致每次递归都在处理同一个字符串,永远没法推进,要么死循环要么没效果。 - 匹配方向反了:你设置的
$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
相关产品推荐
相关产品推荐

