如何使用XSLT移除字符串末尾N个字符并修剪多余空白
问题根因
你写的代码有两个逻辑bug:
- 拼接逻辑错误:你最后把完整的原始字段
DBColumn直接拼到了结果里,原始值本身是Virginia-230,自然会在末尾多出重复的-230片段;另外substring()的偏移量算错了,XSLT字符串索引从1开始,要取最后3位数字应该从string-length(DBColumn)-2位置开始截,你写的减3会把分隔横杠也截进来。 - 没有做多余空白替换逻辑,自然处理不了逗号后的空格。
修正方案
根据你用的XSLT版本选对应实现即可:
XSLT 2.0+ 版本(支持正则,写法最简洁)
不要硬编码截取位置,直接按横杠拆分前后内容再重组,最后用正则替换逗号后的多余空格:
<xsl:value-of select="replace( concat( substring-after(DBColumn, '-'), '-', substring-before(DBColumn, '-') ), ',\s+', ',' )"/>
逻辑说明:
substring-after(DBColumn, '-')直接提取横杠后的数字部分,不用硬编码算长度,哪怕后续数字位数变了也能正常取substring-before(DBColumn, '-')提取横杠前的名称部分,不会带后面的数字后缀- 正则
,\s+会匹配逗号后任意数量的空白,统一替换成单个逗号,不管逗号后有1个还是多个空格都能处理成ABC,230-Virginia的格式
XSLT 1.0 兼容版本
如果是老版本不支持正则,用变量存重组后的值,再精准替换逗号后的空格,避免误删其他位置的有效空格:
<!-- 先重组出 数字-名称 的基础格式 --> <xsl:variable name="baseResult" select="concat( substring(DBColumn, string-length(DBColumn)-2), '-', substring-before(DBColumn, '-') )"/> <!-- 替换逗号后的多余空格 --> <xsl:value-of select="concat( substring-before(concat($baseResult, ', '), ', '), ',', substring-after($baseResult, ', ') )"/>
验证结果
- 原始字段值为
Virginia-230时,输出为230-Virginia,和你的预期一致 - 遇到
ABC, 230-Virginia这类带逗号后空格的场景,会自动输出ABC,230-Virginia,满足修剪要求
内容的提问来源于stack exchange,提问作者Rabit2
相关产品推荐
相关产品推荐

