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

XSLT转换实体匹配异常:仅单一条件生效的解决建议

XSLT双匹配模板失效问题:解决方案&分析

嘿,我看你这问题是典型的XSLT模板优先级冲突搞出来的!咱们先理清楚根因,再给你改好代码。

为啥只有一个匹配生效?

你写了两个**完全一样匹配规则(match="text()")且相同优先级(priority="10")**的模板,XSLT处理器遇到这种情况,只会执行最后定义的那个——另一个模板直接被忽略了,自然没机会处理对应的字符。

搞定方案:合并处理逻辑

别分开写两个text模板啦,把音标和中文字符的处理逻辑合并到同一个模板里,先用变量存下音标处理后的结果,再对这个结果处理中文字符,这样两种匹配都能跑起来。

优化后的完整XSLT代码

<xsl:character-map name="m1">
    <!-- 音标字符映射 -->
    <xsl:output-character character="膷" string="&amp;#x010D;"/>
    <xsl:output-character character="山" string="&amp;#x027D;"/>
    <xsl:output-character character="鈥�" string="&amp;#x201D;"/>
    <xsl:output-character character="魔" string="&amp;#x0127;"/>
    <xsl:output-character character="艙" string="&amp;#x0153;"/>
    <!-- 中文字符映射(清理了重复的膷条目) -->
    <xsl:output-character character="闃�" string="&amp;#x963F;"/>
    <xsl:output-character character="鏄�" string="&amp;#x660E;"/>
    <xsl:output-character character="涓�" string="&amp;#x4E34;"/>
    <xsl:output-character character="宀�" string="&amp;#x5CB8;"/>
    <xsl:output-character character="鍝�" string="&amp;#x54ED;"/>
    <xsl:output-character character="濂�" string="&amp;#x5973;"/>
    <xsl:output-character character="璇�" string="&amp;#x8BD7;"/>
</xsl:character-map>

<xsl:output omit-xml-declaration="no" method="xml" indent="no" encoding="UTF-8" use-character-maps="m1"/>

<xsl:template match="article">
    <xsl:copy>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<xsl:template match="para">
    <xsl:copy>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<xsl:template match="text()" priority="10">
    <!-- 第一步:处理音标字符,把结果存到变量里 -->
    <xsl:variable name="after-phonetic">
        <xsl:analyze-string select="." regex="([&#x010D;&#x027D;&#x201D;&#x0127;&#x0153;]+)">
            <xsl:matching-substring>
                <emph type="Phonetic_italic" cstyle="Phonetic_italic">
                    <xsl:value-of select="."/>
                </emph>
            </xsl:matching-substring>
            <xsl:non-matching-substring>
                <xsl:value-of select="."/>
            </xsl:non-matching-substring>
        </xsl:analyze-string>
    </xsl:variable>
    <!-- 第二步:对处理完音标后的内容,再处理中文字符 -->
    <xsl:analyze-string select="$after-phonetic" regex="([&#x963F;&#x660E;&#x4E34;&#x5CB8;&#x54ED;&#x5973;&#x8BD7;]+)">
        <xsl:matching-substring>
            <emph type="Chienese" cstyle="Chienese">
                <xsl:value-of select="."/>
            </emph>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:copy-of select="."/>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:template>

几个关键改进点

  1. 合并模板:把两个冲突的text模板整合成一个,确保两种处理逻辑都能执行
  2. 修正正则表达式:原正则里的|和多余的n是错误的——方括号[]本身就是字符集合,直接把目标字符的Unicode码放进去就行,不用加分隔符
  3. 保留中间结果结构:处理中文字符时用<xsl:copy-of>代替<xsl:value-of>,这样之前生成的音标<emph>元素不会被转成纯文本
  4. 清理冗余映射:删掉了重复的膷字符映射,让代码更干净

小提示

如果之后需要扩展更多字符类型,只需要在对应的正则字符集里添加新的Unicode码就行,不用再新增模板啦。

内容的提问来源于stack exchange,提问作者 dem Fürstenn Karl August von Weimar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:47:39