通八洲科技

XSLT怎么实现字符串替换 translate()和replace()

日期:2025-12-27 00:00 / 作者:月夜之吻
XSLT中字符串替换首选replace()(XSLT 2.0+,支持正则、子串、全局/忽略大小写),单字符映射用translate()(XSLT 1.0/2.0均支持,仅一对一字符替换);XSLT 1.0需递归模板模拟子串替换。

XSLT 中实现字符串替换主要有两个函数:translate()replace(),它们用途不同、能力差异大,选错容易出错。

translate():单字符一对一替换,简单但限制多

translate() 只能做“字符到字符”的映射,不能处理子字符串,也不能增删字符长度。它接收三个参数:原字符串、要被替换的字符集、替换成的字符集。

例子:把所有 a 换成 Ab 换成 B

结果是 ABc123;注意 c 不在替换列表里,保持不变。

replace():基于正则的灵活替换,XSLT 2.0+ 才有

replace() 是真正的字符串替换主力,支持正则表达式,可替换子串、支持捕获组、能控制全局/首次匹配,功能接近编程语言里的 String.replace()

例子:把所有数字替换成星号,或把 "cat" 替换为 "dog"(不区分大小写):

结果:I have *** cats and *** dogs

结果:dog and dog

XSLT 1.0 没有 replace()?可以模拟但很麻烦

如果只能用 XSLT 1.0(比如老版 IE 或某些遗留系统),replace() 不可用,translate() 又太弱,就得靠递归模板手动实现子串替换。

简单示意逻辑(非完整代码):

定义模板 match-string-replace,输入 text、from、to;若 contains(text, from),就拼接 substring-before + to + 递归调用 substring-after,否则返回原文。

怎么选?看需求再决定

基本上就这些。别硬用 translate() 去干 replace() 的活,也别在 1.0 环境下幻想正则——先看清版本和需求,再动手。