如何用XSLT 1.0实现字符串替换功能

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()预处理。

使用示例与调用方式

在样式表中声明模板后,用调用。例如:


  
  
  

确保模板定义在内顶层,且所有调用前已声明。