
本文介绍如何在xslt 1.0中将形如“line1 | line 2 | line3”的竖线(|)分隔字符串,拆分为多行html输出,每项独占一行,并兼容主流处理器(如xalan)及exslt扩展函数。
本文介绍如何在xslt 1.0中将形如“line1 | line 2 | line3”的竖线(|)分隔字符串,拆分为多行html输出,每项独占一行,并兼容主流处理器(如xalan)及exslt扩展函数。
在XSLT 1.0标准中,原生不支持字符串分割(split()),但可通过EXSLT扩展函数库中的 str:split() 实现高效、简洁的分隔处理。该方案广泛支持于Xalan、Saxon(启用扩展时)等主流处理器。
以下是一个完整、可直接运行的XSLT示例:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="http://exslt.org/strings"
extension-element-prefixes="str">
<xsl:param name="passId" select="'Line1 | Line 2| Line3'"/>
<xsl:template match="/">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<xsl:for-each select="str:split(normalize-space($passId), '|')">
<xsl:variable name="item" select="normalize-space(.)"/>
<xsl:if test="$item != ''">
<xsl:value-of select="$item"/>
<br/>
</xsl:if>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>✅ 关键说明:
-
str:split($passId, '|')将字符串按|拆分为节点集,每个子项作为当前上下文(.); -
normalize-space()清除首尾空格并压缩内部多余空白,避免因"Line1 | Line 2"中空格导致输出含冗余空行; -
<if test="$item != ''"></if>过滤空项(例如"a||b"可能产生空字符串),提升健壮性; -
<br>确保浏览器中视觉换行(若需语义化结构,可替换为<p></p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/xiazai/skill9263" title="Html2md"><img src="https://img.php.cn/upload/skill/000/000/081/179249945220127.jpg" alt="Html2md" ></a> <div class="aritcle_card_info flexColumn"> <a href="/xiazai/skill9263" title="Html2md">Html2md</a> <p>使用 Readability + Turndown 将 HTML 页面转换为干净的、Agent 友好的 Markdown。去除导航栏、广告、页脚、Cookie 横幅、社交按钮等干扰元素。支持 URL...</p> </div> <a href="/xiazai/skill9263" title="Html2md" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>或<div>)。<p>⚠️ <strong>注意事项:</strong> </p> <p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p> <ul> <li>使用前需确认XSLT处理器已启用EXSLT支持(Xalan默认支持;Saxon PE/EE需显式配置); </li> <li>若无法使用扩展函数(如受限于纯标准环境),可采用递归模板实现手动分割,但代码更复杂、可维护性较低; </li> <li>XSLT 2.0+ 用户应优先使用原生 <code>tokenize($passId, '\|'),无需依赖命名空间,且正则更灵活(注意转义竖线)。
综上,借助 str:split 是XSLT 1.0中最简洁、可靠、可读性强的解决方案,适用于参数化动态内容渲染场景。


















