Xslt 递归中的子串值处理

Xslt 递归中的子串值处理,xslt,Xslt,这都是关于反转字符串的。对于给定的值“ABCDEF”,它可以正常工作。输出也是正确的“FEDCBA”。但我想知道这是如何在这个字符串中打印字母“A”和“D”的。有人能帮我理解这一点吗?请 阐述这一工作方法 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefix

这都是关于反转字符串的。对于给定的值“ABCDEF”,它可以正常工作。输出也是正确的“FEDCBA”。但我想知道这是如何在这个字符串中打印字母“A”和“D”的。有人能帮我理解这一点吗?请 阐述这一工作方法

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output method="html"/>
<xsl:template name="reverse">
<xsl:param name="input" select="'ABCDEF'"/>
<xsl:variable name="len" select="string-length($input)"/>
<xsl:choose>
<xsl:when test="$len &lt; 2">
<xsl:value-of select="$input"/>
</xsl:when>
<xsl:when test="$len = 2">
<xsl:value-of select="substring($input,2,1)"/>
<xsl:value-of select="substring($input,1,1)"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="mid" select="floor($len div 2)"/>
<xsl:call-template name="reverse">
<xsl:with-param name="input" select="substring($input,$mid+1,$mid+1)"/>
</xsl:call-template>
<xsl:call-template name="reverse">
<xsl:with-param name="input" select="substring($input,1,$mid)"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="/">
<xsl:call-template name="reverse">
</xsl:call-template>
</xsl:template>
</xsl:stylesheet>

以下是发生的情况:

输入ABCDEF
len=6
len大于2且不等于2
mid=3

使用输入DEF再次调用
len=3
len大于2且不等于2
mid=1

使用输入EF再次呼叫
len=2
len不是>2而是=2
写出第二个字母F
写出第一个字母E

返回外部呼叫
输入为D的呼叫
len小于2
输出D

返回外部呼叫
使用input=ABC再次呼叫
len=3
len大于2而不是2
mid=1

用输入BC再次呼叫
len=2
len不是>2而是=2
写出第二个字母C
写出第一个字母B

返回外部呼叫
使用输入A调用
len小于2

输出A

这里的外部调用是什么意思?我无法理解这一点,只要输入长度大于2,模板就会用一半的输入调用自己。每次这些“自我调用”中的一个结束时,因为长度小于等于2,它就会返回到上面的层,这就是我所说的“外部调用”。也许会帮助您理解递归。