如何在XSLT的translate函数中同时移除重音及特殊字符?
XSLT同时移除重音字符与特殊字符的解决方案
核心思路
利用XSLT的translate()函数特性:第二个参数指定所有需要处理的字符(重音字符+特殊字符),第三个参数仅提供重音字符对应的替换字符,特殊字符因无对应替换项会被直接移除。
XML输入示例
<text> <content>Café au Lait! @#$%^&*()_+</content> <content>Éclair, Ñandu, Piña Colada?</content> </text>
原有XSLT代码(仅处理重音)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <output> <xsl:for-each select="text/content"> <item> <xsl:value-of select="translate(., 'ÀÁÂÃÄÅàáâãäåÈÉÊËèéêëÌÍÎÏìíîïÒÓÔÕÖØòóôõöøÙÚÛÜùúûüÝýÑñ', 'AAAAAAaaaaaaEEEEeeeeIIIIiiiiOOOOOOooooooUUUUuuuuYyNn')"/> </item> </xsl:for-each> </output> </xsl:template> </xsl:stylesheet>
当前输出(特殊字符未移除)
<output> <item>Cafe au Lait! @#$%^&*()_+</item> <item>Eclair, Nandu, Pina Colada?</item> </output>
修改后的XSLT代码(同时处理重音与特殊字符)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <output> <xsl:for-each select="text/content"> <item> <xsl:value-of select="translate(., 'ÀÁÂÃÄÅàáâãäåÈÉÊËèéêëÌÍÎÏìíîïÒÓÔÕÖØòóôõöøÙÚÛÜùúûüÝýÑñ!@#$%^&*()_+?,', 'AAAAAAaaaaaaEEEEeeeeIIIIiiiiOOOOOOooooooUUUUuuuuYyNn')"/> </item> </xsl:for-each> </output> </xsl:template> </xsl:stylesheet>
关键修改点:
- 将需要移除的特殊字符(
!@#$%^&*()_+?,等)追加到translate()的第二个参数末尾 - XML中
&需转义为&,避免语法错误 - 第三个参数保持原有重音替换字符,特殊字符因无对应替换项会被自动移除
预期输出
<output> <item>Cafe au Lait </item> <item>Eclair Nandu Pina Colada</item> </output>
扩展说明
- 如果使用XSLT 2.0及以上版本,也可通过
replace()函数结合正则表达式批量移除特殊字符,示例:
正则<xsl:value-of select="replace(translate(., 'ÀÁÂÃÄÅàáâãäåÈÉÊËèéêëÌÍÎÏìíîïÒÓÔÕÖØòóôõöøÙÚÛÜùúûüÝýÑñ', 'AAAAAAaaaaaaEEEEeeeeIIIIiiiiOOOOOOooooooUUUUuuuuYyNn'), '[^\w\s]', '')"/>[^\w\s]会匹配所有非单词、非空格字符并移除,适合批量处理大量特殊字符的场景。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

