如何通过XSLT转换XML时将指定特殊字符替换为普通字符
XSLT特殊字符替换实现方案
你当前需求是将XML中Name字段的带重音特殊字符转换为对应基础拉丁字符,基于你使用的XSLT 2.0版本,有两种可行实现方式:
方案1:固定字符映射替换
适合你已经明确所有待替换特殊字符的场景,直接使用XPath内置的translate()函数完成字符一一映射替换,代码修改量极小。
修改后的完整XSLT如下:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="urn:com.test/bsvc" exclude-result-prefixes="wd"> <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> <xsl:template match="/"> <xsl:for-each select="wd:File/wd:Entry"> <Details> <ID> <xsl:value-of select="wd:ID"/> </ID> <Name> <!-- translate函数第二个参数是待替换特殊字符,第三个是对应目标字符,位置一一对应 --> <xsl:value-of select="translate(wd:Name, 'áéÿ', 'aey')"/> </Name> </Details> </xsl:for-each> </xsl:template> </xsl:stylesheet>
方案2:通用去重音转换
如果后续还有其他带重音的拉丁字符需要处理,不需要逐个罗列替换规则,使用Unicode规范化+正则替换的通用方案即可覆盖所有带重音拉丁字符转基础字符的需求:
将Name字段的取值逻辑替换为以下代码即可:
<xsl:value-of select="replace(normalize-unicode(wd:Name, 'NFD'), '\p{Mn}', '')"/>
逻辑说明:
normalize-unicode(..., 'NFD')会将带重音的复合Unicode字符拆分为「基础字符+组合重音标记」两个独立Unicode编码\p{Mn}是Unicode字符类,匹配所有非间距组合标记(即所有重音符号),替换为空后仅保留基础拉丁字符
两种方案都可以直接输出你需要的预期结果。
内容的提问来源于stack exchange,提问作者user9324800
相关产品推荐
相关产品推荐

