XSLT中字符串替换首选replace()(XSLT 2.0+,支持正则、子串、全局/忽略大小写),单字符映射用translate()(XSLT 1.0/2.0均支持,仅一对一字符替换);XSLT 1.0需递归模板模拟子串替换。
XSLT 中实现字符串替换主要有两个函数:translate() 和 replace(),它们用途不同、能力差异大,选错容易出错。
ate():单字符一对一替换,简单但限制多translate() 只能做“字符到字符”的映射,不能处理子字符串,也不能增删字符长度。它接收三个参数:原字符串、要被替换的字符集、替换成的字符集。
例子:把所有 a 换成 A,b 换成 B:
结果是 ABc123;注意 c 不在替换列表里,保持不变。
replace() 是真正的字符串替换主力,支持正则表达式,可替换子串、支持捕获组、能控制全局/首次匹配,功能接近编程语言里的 String.replace()。
replace($input, $pattern, $replacement, $flags?)
$flags 常用 g(全局)、i(忽略大小写)、gi(两者都用)例子:把所有数字替换成星号,或把 "cat" 替换为 "dog"(不区分大小写):
结果:I have *** cats and *** dogs
结果:dog and dog
如果只能用 XSLT 1.0(比如老版 IE 或某些遗留系统),replace() 不可用,translate() 又太弱,就得靠递归模板手动实现子串替换。
substring-before() 和 substring-after() 配合递归,每次找第一个匹配位置,拼接前后 + 替换内容简单示意逻辑(非完整代码):
定义模板 match-string-replace,输入 text、from、to;若 contains(text, from),就拼接 substring-before + to + 递归调用 substring-after,否则返回原文。translate(),轻量又高效replace(),且确认处理器支持 XSLT 2.0+基本上就这些。别硬用 translate() 去干 replace() 的活,也别在 1.0 环境下幻想正则——先看清版本和需求,再动手。