就像注释中建议的那样,您可以使用递归模板来解决这个问题。在本例中,模板
replace
将拆分输入字符串
$file
在字符串“inline”前后的子字符串中。只要
$sub_after
还包含字符串“inline”,模板递归调用自身。如果中没有此类字符串
$sub\u之后
,将提取其字符串并完成模板。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="1.0">
<xsl:template match="/">
<xsl:call-template name="replace">
<xsl:with-param name="file" select="'https://id/1001976586/file_version/name/small/inline/disposition/inline/test'"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="replace">
<xsl:param name="file"/>
<xsl:variable name="sub_before" select="substring-before($file, 'inline')"/>
<xsl:variable name="sub_after" select="substring-after($file, 'inline')"/>
<xsl:value-of select="concat($sub_before, 'attachment')"/>
<xsl:choose>
<xsl:when test="contains($sub_after, 'inline')">
<xsl:call-template name="replace">
<xsl:with-param name="file" select="$sub_after"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$sub_after"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>