XSLT中如何使用split类函数拆分斜杠分隔字符串生成指定格式输出
XSLT 斜杠分隔字符串拆分实现方案
根据你使用的XSLT版本选择对应方案即可,不需要写多层嵌套的substring-before/substring-after:
XSLT 2.0 / 3.0 版本(最简实现)
2.0及以上版本内置了和split功能完全一致的tokenize()函数,支持按正则匹配分隔符拆分字符串为序列,直接按下标取字段即可。
针对你的输入场景,实现逻辑分两步:
- 先按换行符拆分原始输入,过滤掉空行得到每条记录
- 单条记录按
/拆分,得到的3个元素依次对应Country、Code、Line字段
完整示例代码:
<xsl:variable name="rawInput" select="'UK/006/10 US/004/12'"/> <xsl:for-each select="tokenize($rawInput, '\r?\n')[normalize-space(.)]"> <xsl:variable name="splitFields" select="tokenize(., '/')"/> <xsl:text>Country: </xsl:text><xsl:value-of select="$splitFields[1]"/><xsl:text> </xsl:text> <xsl:text>Code: </xsl:text><xsl:value-of select="$splitFields[2]"/><xsl:text> </xsl:text> <xsl:text>Line: </xsl:text><xsl:value-of select="$splitFields[3]"/><xsl:text> </xsl:text> </xsl:for-each>
运行后输出格式和你预期完全一致,后续如果字段数量、分隔符有调整,只需要修改tokenize的参数和对应下标即可,维护成本远低于嵌套截取写法。
XSLT 1.0 兼容方案
如果你的运行环境只支持XSLT 1.0(比如老版本的Xalan、.NET Framework自带的XSLT引擎),没有内置tokenize,可以先写一个通用的递归拆分模板,一次定义后全局复用,不用每次写嵌套截取:
<!-- 通用字符串拆分模板 --> <xsl:template name="splitString"> <xsl:param name="input" select="''"/> <xsl:param name="delimiter" select="'/'"/> <xsl:if test="string-length($input) > 0"> <item> <xsl:choose> <xsl:when test="contains($input, $delimiter)"> <xsl:value-of select="substring-before($input, $delimiter)"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$input"/> </xsl:otherwise> </xsl:choose> </item> <xsl:if test="contains($input, $delimiter)"> <xsl:call-template name="splitString"> <xsl:with-param name="input" select="substring-after($input, $delimiter)"/> <xsl:with-param name="delimiter" select="$delimiter"/> </xsl:call-template> </xsl:if> </xsl:if> </xsl:template>
调用时将待拆分字符串传入模板,会返回按分隔符拆分好的节点集,直接按下标取对应位置的字段即可。
小提示:如果你的原始输入存在前后多余空格,可以在拆分前用
normalize-space()处理单条记录,避免取到带空格的无效字段值。
内容的提问来源于stack exchange,提问作者Suren Sivalingam
相关产品推荐
相关产品推荐

