XPath串函数是一组用于处理字符串的内置函数,在XSLT转换XML文档时扮演关键角色。很多XML原始数据并不适合直接展示,比如用户名附带系统前缀、描述信息含有不规则空白,这时就可以在XSLT模板里调用XPath串函数做清洗和重组。理解它们的参数规则和返回逻辑,是写出稳定样式表的基础。

XPath常见串函数分类
XPath 1.0提供了一组实用的字符串函数,最常用的是concat、substring、substring-before、substring-after、normalize-space、translate以及string-length。这些函数都接收一个或多个字符串参数,返回处理后的字符串或数值。在XSLT中,它们通常出现在select属性或test条件判断里,用于对源节点值做即时运算。
例如concat(first, ' ', last)可以把名和姓拼成完整姓名;normalize-space(address)会把地址里的首尾空格和中间连续空白压缩成单个空格。要注意的是,如果传入的节点不存在,大多数串函数会把空节点集当成空字符串处理,而不会报错,这在某些情况下会导致输出空缺,需要配合choose语句兜底。
substring-before与substring-after实战
当数据格式固定为“标识@域名”时,substring-before(email, '@')可提取账号部分,substring-after(email, '@')则拿到域名。这类函数在日志拆分、邮件脱敏场景中非常高效。下面是一段XSLT示例,将用户邮箱转换为仅显示账号的列表项。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="users">
<ul>
<xsl:for-each select="user">
<li>
<xsl:value-of select="substring-before(email, '@')"/>
的账号已注册
</li>
</xsl:for-each>
</ul>
</xsl:template>
</xsl:stylesheet>
上述代码遍历users下的每个user节点,利用substring-before剥离邮箱域名。如果email节点为空,substring-before返回空字符串,页面会显示“的账号已注册”,此时可用xsl:if做存在性校验。这种写法比在后端预处理XML更灵活,样式与数据彻底分离。
XSLT中串函数的组合技巧
单独使用某个串函数往往不够,真实业务常需要组合。比如将姓名转为大写并拼接编号:translate(concat(name, '-', id), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')。translate负责大小写映射,concat负责拼接,二者嵌套后可在select中一步到位。
另一个常见需求是清理富文本摘要。假设description节点含有换行和制表符,先normalize-space去掉多余空白,再用string-length判断截断位置,超长时调用substring配合concat加省略号。这种组合在生成HTML摘要卡片时非常实用,且逻辑全部声明在XSLT内,便于非开发人员调整展示规则。
normalize-space与translate对比
normalize-space仅压缩空白,不改变字符内容;translate则按字符映射替换,可实现小写转大写或去除特定符号。二者职责不同,却能衔接使用:先normalize-space(email)清理空格,再translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')统一小写,避免后续匹配忽略大小写问题。
| 函数 | 主要作用 | 典型场景 |
|---|---|---|
| normalize-space | 压缩首尾及连续空白 | 地址、摘要清洗 |
| translate | 字符级替换与大小写转换 | 编码统一、符号剔除 |
| substring-before | 取分隔符前内容 | 邮箱账号提取 |
通过表格可以清晰看到,不同串函数解决不同维度的字符串问题。在XSLT模板中合理选型,能大幅减少额外脚本的编写量。
完整转换示例
下面给出一个较完整的XSLT,将包含用户信息的XML转换成HTML片段,组合使用concat、normalize-space与substring-after,并做空值保护。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<div class="user-list">
<xsl:for-each select="root/user">
<p>
<xsl:variable name="raw" select="normalize-space(info)"/>
<xsl:choose>
<xsl:when test="string-length($raw) > 0">
<xsl:value-of select="concat('用户:', substring-after($raw, ':'))"/>
</xsl:when>
<xsl:otherwise>暂无资料</xsl:otherwise>
</xsl:choose>
</p>
</xsl:for-each>
</div>
</xsl:template>
</xsl:stylesheet>
该示例先以normalize-space清理info文本,再用substring-after以冒号分割取出后半段,最后concat添加“用户:”前缀。choose结构确保空节点输出“暂无资料”而不是空白段落。这种写法在内容管理系统导出静态页时非常可靠。
总体来看,XPath串函数扩展了XSLT的表达能力,让XML到HTML或文本的映射不再依赖外部程序。只要理清每个函数的边界情况,就能用声明式样式表应对多数数据转换需求。
XPathstring_functionXSLT修改时间:2026-08-01 17:24:28