XSLT v1.0中使用translate函数替换XML特殊转义字符失败求助
XSLT 1.0 替换XML特殊字符(含&)的解决方案
问题原因
你用translate函数替换&失效,核心原因是**translate仅支持单字符一对一替换**。当你写translate(..., '&', '&')时,只会把&替换成第三个参数的第一个字符&,后面的amp;会被直接忽略,完全达不到转义效果。
需求回顾
需要同时完成两类字符替换:
- 拉丁特殊字符替换:
Ñ→Nñ→nÇ→Cç→c
- XML特殊字符转义:
&→&<→<>→>"→"'→'
解决方案:递归模板处理
XSLT 1.0没有内置的XML转义函数,我们可以写一个递归模板逐个字符处理,既支持单字符替换,也支持单字符转成多字符序列:
<!-- 定义递归转义模板 --> <xsl:template name="escape-xml"> <xsl:param name="text"/> <xsl:param name="escaped-text" select="''"/> <xsl:choose> <!-- 所有字符处理完成,返回结果 --> <xsl:when test="string-length($text) = 0"> <xsl:value-of select="$escaped-text"/> </xsl:when> <xsl:otherwise> <!-- 截取当前第一个字符 --> <xsl:variable name="current-char" select="substring($text, 1, 1)"/> <!-- 替换当前字符 --> <xsl:variable name="replaced-char"> <xsl:choose> <!-- 先处理拉丁特殊字符替换 --> <xsl:when test="$current-char = 'Ñ'">N</xsl:when> <xsl:when test="$current-char = 'ñ'">n</xsl:when> <xsl:when test="$current-char = 'Ç'">C</xsl:when> <xsl:when test="$current-char = 'ç'">c</xsl:when> <!-- 再处理XML特殊字符转义 --> <xsl:when test="$current-char = '&'">&amp;</xsl:when> <xsl:when test="$current-char = '<'">&lt;</xsl:when> <xsl:when test="$current-char = '>'">&gt;</xsl:when> <xsl:when test="$current-char = '"'">&quot;</xsl:when> <xsl:when test="$current-char = '''">&apos;</xsl:when> <!-- 其他字符原样保留 --> <xsl:otherwise><xsl:value-of select="$current-char"/></xsl:otherwise> </xsl:choose> </xsl:variable> <!-- 递归处理剩余字符 --> <xsl:call-template name="escape-xml"> <xsl:with-param name="text" select="substring($text, 2)"/> <xsl:with-param name="escaped-text" select="concat($escaped-text, $replaced-char)"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template>
调用模板
在需要处理文本的地方,调用这个模板即可:
<xsl:call-template name="escape-xml"> <xsl:with-param name="text" select="InstructionGrouping/Payer/LegalEntityName"/> </xsl:call-template>
效果验证
输入XML:
<LegalEntityName>Legal & entity Beach & Resort LLC</LegalEntityName>
输出结果:
Legal & entity Beach & Resort LLC
同时原有的Ñ、ñ、Ç、ç也会被正确替换为N、n、C、c。
内容的提问来源于stack exchange,提问作者Saurabh Maheshwari
相关产品推荐
相关产品推荐

