XSLT转换实体匹配异常:仅单一条件生效的解决建议
XSLT双匹配模板失效问题:解决方案&分析
嘿,我看你这问题是典型的XSLT模板优先级冲突搞出来的!咱们先理清楚根因,再给你改好代码。
为啥只有一个匹配生效?
你写了两个**完全一样匹配规则(match="text()")且相同优先级(priority="10")**的模板,XSLT处理器遇到这种情况,只会执行最后定义的那个——另一个模板直接被忽略了,自然没机会处理对应的字符。
搞定方案:合并处理逻辑
别分开写两个text模板啦,把音标和中文字符的处理逻辑合并到同一个模板里,先用变量存下音标处理后的结果,再对这个结果处理中文字符,这样两种匹配都能跑起来。
优化后的完整XSLT代码
<xsl:character-map name="m1"> <!-- 音标字符映射 --> <xsl:output-character character="膷" string="&#x010D;"/> <xsl:output-character character="山" string="&#x027D;"/> <xsl:output-character character="鈥�" string="&#x201D;"/> <xsl:output-character character="魔" string="&#x0127;"/> <xsl:output-character character="艙" string="&#x0153;"/> <!-- 中文字符映射(清理了重复的膷条目) --> <xsl:output-character character="闃�" string="&#x963F;"/> <xsl:output-character character="鏄�" string="&#x660E;"/> <xsl:output-character character="涓�" string="&#x4E34;"/> <xsl:output-character character="宀�" string="&#x5CB8;"/> <xsl:output-character character="鍝�" string="&#x54ED;"/> <xsl:output-character character="濂�" string="&#x5973;"/> <xsl:output-character character="璇�" string="&#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="([čɽ”ħœ]+)"> <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="([阿明临岸哭女诗]+)"> <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>
几个关键改进点
- 合并模板:把两个冲突的text模板整合成一个,确保两种处理逻辑都能执行
- 修正正则表达式:原正则里的
|和多余的n是错误的——方括号[]本身就是字符集合,直接把目标字符的Unicode码放进去就行,不用加分隔符 - 保留中间结果结构:处理中文字符时用
<xsl:copy-of>代替<xsl:value-of>,这样之前生成的音标<emph>元素不会被转成纯文本 - 清理冗余映射:删掉了重复的
膷字符映射,让代码更干净
小提示
如果之后需要扩展更多字符类型,只需要在对应的正则字符集里添加新的Unicode码就行,不用再新增模板啦。
内容的提问来源于stack exchange,提问作者 dem Fürsten
相关产品推荐
相关产品推荐

