XSL多值替换去重问题:文件名变音符号替换后重复
解决XSL文件名变音符号替换后重复的问题
问题描述
我尝试对文件名中的变音符号(ä、ö、ü)进行过滤替换,但存在问题:当文件名包含全部三个变音符号时,转换后的文件名会重复出现。当前使用的XSL代码如下:
<xsl:choose> <xsl:when test="contains($name,'ä') or contains($name,'ö') or contains($name,'ü')"> <xsl:value-of select="replace($name, 'ä', 'ae'),replace($name,'ö','oe'),replace($name, 'ü', 'ue') " /> </xsl:when> </xsl:choose>
无论如何尝试,要么仅替换单个变音符号,要么转换后文件名重复。尝试嵌套replace仅使用一次变量时,文件保存报错。请问如何实现仅保留一份文件名且替换所有变音符号?
解决方案
问题根源是你用逗号分隔多个replace函数,<xsl:value-of>会把每个函数的结果依次输出,自然会重复文件名。正确做法是嵌套调用replace,让前一次替换的结果作为下一次的输入,一次完成所有替换,只输出一份结果。
修正后的代码:
<xsl:choose> <xsl:when test="contains($name,'ä') or contains($name,'ö') or contains($name,'ü')"> <xsl:value-of select="replace(replace(replace($name, 'ä', 'ae'), 'ö', 'oe'), 'ü', 'ue')" /> </xsl:when> <!-- 可选:处理无变音符号的情况,直接输出原文件名 --> <xsl:otherwise> <xsl:value-of select="$name" /> </xsl:otherwise> </xsl:choose>
关键说明
- 最内层
replace先替换所有ä为ae,输出的结果直接传给第二层replace处理ö - 第二层处理完成后,结果再传给最外层
replace替换ü - 整个流程只生成一个处理后的字符串,
<xsl:value-of>只会输出一次,不会出现重复
另外补充:如果用的是XSLT 2.0及以上版本,translate函数只适合单字符替换(比如a→b),但这里是单字符转多字符(ä→ae),所以必须用replace,嵌套调用是最稳妥的方案。
内容的提问来源于stack exchange,提问作者Nila91
相关产品推荐
相关产品推荐

