
本文介绍如何在 XSLT 1.0 中将形如 "Line1 | Line 2 | Line3" 的竖线(|)分隔字符串,逐项换行渲染为 HTML 页面内容,借助 EXSLT 扩展函数 str:split 实现高效、可读性强的模板处理。
本文介绍如何在 xslt 1.0 中将形如 "line1 | line 2 | line3" 的竖线(|)分隔字符串,逐项换行渲染为 html 页面内容,借助 exslt 扩展函数 `str:split` 实现高效、可读性强的模板处理。
在标准 XSLT 1.0 中,原生不支持字符串分割(如 JavaScript 的 split()),但可通过扩展函数库(如 EXSLT)弥补这一限制。针对输入参数 passId="Line1 | Line 2| Line3"(注意前后空格与分隔符两侧空白),目标是将其按 | 拆分为独立项,并在 HTML 中每项后添加 <br> 实现视觉换行。
以下为完整、可直接运行的 XSLT 1.0 解决方案(兼容 Xalan、Saxon PE/EE 等支持 EXSLT 的处理器):
<stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:str="http://exslt.org/strings" extension-element-prefixes="str"><param name="passId"> <template match="/"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <for-each select="str:split(normalize-space($passId), '|')"><value-of select="normalize-space(.)"></value-of><br></for-each></template></stylesheet>
✅ 关键优化说明:
- 使用
normalize-space($passId)预处理整个输入字符串,消除首尾空格及分隔符前后的冗余空白; - 在
for-each循环内对每个分割项再次调用normalize-space(.),确保" Line 2 "输出为干净的Line 2; - 显式声明
<meta>标签保障字符编码正确,避免中文或特殊符号乱码; -
<br>置于循环体内末尾,严格对应每项输出,语义清晰。
⚠️ 注意事项:
- 此方案依赖 EXSLT
str:split扩展函数,需确认所用 XSLT 处理器已启用该扩展(Xalan 默认支持;Saxon 9.x HE 不支持,需升级至 PE/EE 或改用纯 XSLT 2.0+ 方案); - 若受限于环境无法使用扩展,XSLT 1.0 可通过递归命名模板手动实现分割(代码更长且易出错),不推荐作为首选;
- XSLT 2.0+ 用户可直接使用内置函数:
<for-each select="tokenize($passId, '\s*\|\s*')"></for-each>,正则支持更健壮,无需额外命名空间。
最终输出 HTML 将准确呈现为:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">Line1<br>Line 2<br>Line3<br>
页面中三行内容垂直排列,完全符合预期。










