XSLT 1.0需用递归模板模拟replace():定义replace-string模板,用substring-before/after定位并替换首个匹配,再递归处理剩余部分;须校验空from或text以避免无限递归,天然支持全局替换但区分大小写且不支持正则。

XSLT 1.0本身没有内置的replace()函数(那是XSLT 2.0+才支持的),但可以通过递归模板模拟字符串替换功能,核心思路是:每次查找第一个匹配子串,将其替换,再对剩余部分继续处理。
基础递归替换模板
定义一个命名模板(如replace-string),接收三个参数:text(原文本)、from(待替换子串)、to(替换为的字符串)。利用substring-before()和substring-after()定位首次出现位置,拼接结果并递归处理余下部分。
- 若
text中不包含from,直接返回text - 否则,取
substring-before(text, from)+to+ 对substring-after(text, from)的递归调用
处理空字符串与边界情况
需特别注意from为空字符串时会无限递归(因为substring-before(text, '') == ''恒成立)。应在模板开头加判断:当from为空时,直接返回text。同样,若text为空,也直接返回。
另外,substring-before/after在未找到from时返回空字符串,可据此作为递归终止条件。
实现全局替换(不止第一次)
上述递归天然支持全局替换——每次只处理第一个匹配,替换后对后续内容继续调用自身,直到无匹配为止。例如将"ababab"中所有"ab"换成"x",会逐步变成"xabab" → "xxab" → "xxx"。
注意:该方法区分大小写,且不支持正则;如需忽略大小写,需先统一转大小写再处理,或配合translate()预处理。
使用示例与调用方式
在样式表中声明模板后,用调用。例如:
确保模板定义在内顶层,且所有调用前已声明。










