如何在XSLT 1.0中分割动态字符串并动态生成多个变量
XSL拆分
--分隔字符串并生成变量实现方案 方案1:XSLT 2.0及以上版本(推荐,无需递归)
tokenize()就是你要找的比substring-before更合适的函数,它是XSLT 2.0内置的专用字符串拆分函数,支持按正则规则拆分字符串,直接返回拆分后的序列,不需要写递归逻辑。
示例实现代码如下:
<!-- 拆分原始字符串为序列,分隔符为-- --> <xsl:variable name="splitValues" select="tokenize($var, '--')" /> <!-- 按位置取值即可,XSLT序列下标从1开始 --> <xsl:variable name="VAR1" select="$splitValues[1]" /> <!-- 取值为A --> <xsl:variable name="VARnew2" select="$splitValues[2]" /> <!-- 取值为B --> <xsl:variable name="VARnew3" select="$splitValues[3]" /> <!-- 取值为C --> <!-- 后续位置的取值以此类推,支持任意长度的拆分结果 -->
注意:XSLT为静态作用域语言,无法动态生成变量名,但是通过序列下标访问的方式可以完全实现按位置取对应拆分值的需求,和你预想的动态变量效果一致。
方案2:XSLT 1.0版本(仅支持递归模板实现)
如果你的运行环境只能兼容XSLT 1.0,没有内置拆分函数,就需要通过递归模板实现拆分,示例代码如下:
<!-- 通用递归拆分字符串模板 --> <xsl:template name="splitString"> <xsl:param name="inputStr" /> <xsl:param name="delimiter" /> <xsl:param name="index" select="1" /> <xsl:choose> <xsl:when test="contains($inputStr, $delimiter)"> <item index="{$index}" value="{substring-before($inputStr, $delimiter)}" /> <!-- 递归处理剩余字符串 --> <xsl:call-template name="splitString"> <xsl:with-param name="inputStr" select="substring-after($inputStr, $delimiter)" /> <xsl:with-param name="delimiter" select="$delimiter" /> <xsl:with-param name="index" select="$index + 1" /> </xsl:call-template> </xsl:when> <xsl:otherwise> <item index="{$index}" value="{$inputStr}" /> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- 调用模板生成拆分后的节点集 --> <xsl:variable name="splitValues"> <xsl:call-template name="splitString"> <xsl:with-param name="inputStr" select="$var" /> <xsl:with-param name="delimiter" select="'--'" /> </xsl:call-template> </xsl:variable> <!-- 按位置取值,XSLT1.0需要借助扩展函数转换结果树为节点集,以下为libxslt处理器的写法,不同处理器扩展函数命名空间可能有差异 --> <xsl:variable name="VAR1" select="exsl:node-set($splitValues)/item[@index=1]/@value" /> <xsl:variable name="VARnew2" select="exsl:node-set($splitValues)/item[@index=2]/@value" />
内容的提问来源于stack exchange,提问作者Guitounoux
相关产品推荐
相关产品推荐

