You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT v1.0中使用translate函数替换XML特殊转义字符失败求助

XSLT 1.0 替换XML特殊字符(含&)的解决方案

问题原因

你用translate函数替换&失效,核心原因是**translate仅支持单字符一对一替换**。当你写translate(..., '&', '&')时,只会把&替换成第三个参数的第一个字符&,后面的amp;会被直接忽略,完全达不到转义效果。

需求回顾

需要同时完成两类字符替换:

  1. 拉丁特殊字符替换:
    • Ñ → N
    • ñ → n
    • Ç → C
    • ç → c
  2. XML特殊字符转义:
    • & → &
    • < → &lt;
    • > → &gt;
    • " → &quot;
    • ' → &apos;

解决方案:递归模板处理

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;'">&amp;amp;</xsl:when>
          <xsl:when test="$current-char = '&lt;'">&amp;lt;</xsl:when>
          <xsl:when test="$current-char = '&gt;'">&amp;gt;</xsl:when>
          <xsl:when test="$current-char = '&quot;'">&amp;quot;</xsl:when>
          <xsl:when test="$current-char = '&apos;'">&amp;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 &amp; entity Beach &amp; Resort LLC

同时原有的Ñ、ñ、Ç、ç也会被正确替换为N、n、C、c。

内容的提问来源于stack exchange,提问作者Saurabh Maheshwari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 20:25:16