如何在XSLT中使用substring-after获取最后一个分隔符后的内容
XSLT提取最后一个分隔符后内容的实现方法
以下以分隔符-、待处理字符串N1-N2-N3、目标结果N3为例给出方案:
适配XSLT 1.0版本(基于substring-after递归实现)
XSLT 1.0没有内置的字符串拆分函数,直接通过递归调用substring-after反复截取剩余内容,直到不存在分隔符即可得到最后一段内容:
<!-- 定义递归提取模板 --> <xsl:template name="getLastSegment"> <xsl:param name="inputStr" /> <xsl:param name="delimiter" /> <xsl:choose> <xsl:when test="contains($inputStr, $delimiter)"> <xsl:call-template name="getLastSegment"> <xsl:with-param name="inputStr" select="substring-after($inputStr, $delimiter)" /> <xsl:with-param name="delimiter" select="$delimiter" /> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$inputStr" /> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- 调用示例 --> <xsl:call-template name="getLastSegment"> <xsl:with-param name="inputStr" select="'N1-N2-N3'" /> <xsl:with-param name="delimiter" select="'-'" /> </xsl:call-template>
该方案兼容边界场景:如果输入字符串不包含分隔符,会直接返回原字符串。
适配XSLT 2.0及以上版本
如果不限制必须用substring-after,可以直接用更简洁的tokenize函数实现:
<xsl:value-of select="tokenize('N1-N2-N3', '-')[last()]" />
如果要求必须基于substring-after实现,可以按以下逻辑编写:
<xsl:value-of select=" if (contains('N1-N2-N3', '-')) then substring-after('N1-N2-N3', string-join(tokenize('N1-N2-N3', '-')[position() ne last()], '-')) else 'N1-N2-N3' " />
内容的提问来源于stack exchange,提问作者MOz
相关产品推荐
相关产品推荐

