在XSLT 1.0中拆分变量并应用于for-each循环
在XSLT 1.0中拆分逗号分隔变量并循环处理
当然可以在XSLT 1.0里实现你的需求!你之前尝试用substring-before直接放到for-each里出错,核心原因是**for-each需要遍历节点集,而substring-before返回的是字符串值,不是节点**,所以会触发运行时错误。
在XSLT 1.0中,没有原生的tokenize函数(那是XSLT 2.0才引入的),最优的实现方式是使用递归模板——这是处理字符串拆分的标准、兼容性最好的方案,不需要依赖任何扩展函数。
实现步骤与完整代码
下面是修改后的完整XSLT代码,我会逐部分解释:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <!-- 定义你的逗号分隔变量 --> <xsl:variable name="SortOrder">Birthday, Housenumber, Zipcode, Carbrand, LicensePlate, Polis, Damageyears, Kmperyear</xsl:variable> <xsl:variable name="delimeter">, </xsl:variable> <!-- 调用递归模板处理拆分后的每个元素 --> <xsl:call-template name="process-token"> <xsl:with-param name="input" select="$SortOrder"/> <xsl:with-param name="delimiter" select="$delimeter"/> </xsl:call-template> </xsl:template> <!-- 递归模板:拆分字符串并处理每个token --> <xsl:template name="process-token"> <xsl:param name="input"/> <xsl:param name="delimiter"/> <!-- 仅当输入字符串不为空时继续处理 --> <xsl:if test="$input != ''"> <!-- 提取第一个token:concat是为了兼容最后一个没有分隔符的元素 --> <xsl:variable name="current-token" select="substring-before(concat($input, $delimiter), $delimiter)"/> <!-- 这里写你要对每个token执行的操作 --> <p>Processing token: <strong><xsl:value-of select="$current-token"/></strong></p> <!-- 处理剩余的字符串,递归调用模板 --> <xsl:call-template name="process-token"> <xsl:with-param name="input" select="substring-after($input, $delimiter)"/> <xsl:with-param name="delimiter" select="$delimiter"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>
关键逻辑说明
- 递归模板
process-token:这是核心,它会反复调用自己,每次处理字符串的一个token,直到字符串为空。 concat($input, $delimiter)的作用:确保最后一个没有尾随分隔符的元素也能被正确提取,避免substring-before返回空值。- 灵活性:你可以把
<p>Processing token: ...</p>替换成任何你需要的操作(比如生成XML元素、调用其他模板等)。
为什么不推荐扩展函数?
有些XSLT处理器支持EXSLT的str:tokenize函数,但它不是XSLT 1.0的标准特性,不同处理器的兼容性不一致。而递归模板是所有XSLT 1.0处理器都支持的通用方案,没有兼容性问题。
内容的提问来源于stack exchange,提问作者Ronald Vesterink
相关产品推荐
相关产品推荐

