XSL 输出子字符串不同 // 递归不调用数据
XSL output substring differs // recursion doesn't call data
我需要对以下输入进行子字符串化,但是对于迭代版本(排除错误数据!),第三种情况的输出是错误的。但是使用的方法都是一样的
对于递归版本,我试了很多方法,但是不管用..!
如果有人能帮助我或告诉我,为什么迭代方式的输出不同,我将非常感激!
迭代版本使用以下数据输入进行测试
1: 1234
2: 123456789012345678901234
3: 1234567890123456789012345678901234567890123
输出:
1:正确
1234
2:正确
12345678901234567890
1234
3: 错误
12345678901234567890
12345678901234567890**123**
123
<xsl:template match="reportId">
<xsl:variable name="reportId" select="."/>
<xsl:choose>
<xsl:when test="string-length($reportId) > 21 and string-length($reportId) < 40">
<fo:block>
<xsl:value-of select="substring($reportId,1,20)" />
<fo:block/>
<xsl:value-of select="substring($reportId,21)" />
<fo:block/>
</fo:block>
</xsl:when>
<xsl:when test="string-length($reportId) > 41 and string-length($reportId) < 60">
<fo:block>
<xsl:value-of select="substring($reportId,1,20)" />
<fo:block/>
<xsl:value-of select="substring($reportId,21,40)" />
<fo:block/>
<xsl:value-of select="substring($reportId,41)" />
<fo:block/>
</fo:block>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$reportId"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
迭代版本
<xsl:template match="subId">
<xsl:param name="prev"/>
<xsl:choose>
<xsl:when test="$prev != ''">
<fo:block>
<xsl:value-of select="substring($prev,1,20)" />
</fo:block>
<xsl:call-template name="subId">
<xsl:with-param name="prev" select="substring($prev,21)"/>
</xsl:call-template>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="reportId">
<xsl:variable name="reportId" select="."/>
<xsl:call-template name="subId">
<xsl:with-param name="prev" select="$reportId"/>
</xsl:call-template>
</xsl:template>
您的指令:
<xsl:value-of select="substring($reportId,21,40)" />
returns 输入字符串中的 40 个字符,从字符 #21 开始。如果你想将你的输入分成 20 个字符的子字符串,你应该使用:
<xsl:value-of select="substring($reportId,21,20)" />
请注意,您的代码可以简化为:
<xsl:template match="reportId">
<fo:block>
<xsl:value-of select="substring(., 1, 20)" />
<fo:block/>
</fo:block>
<xsl:if test="string-length(.) > 20">
<fo:block>
<xsl:value-of select="substring(., 21, 20)" />
<fo:block/>
</fo:block>
</xsl:if>
<xsl:if test="string-length(.) > 40">
<fo:block>
<xsl:value-of select="substring(., 41)" />
<fo:block/>
</fo:block>
</xsl:if>
</xsl:template>
更好的是,使用真正的递归模板 - 参见示例:
我需要对以下输入进行子字符串化,但是对于迭代版本(排除错误数据!),第三种情况的输出是错误的。但是使用的方法都是一样的
对于递归版本,我试了很多方法,但是不管用..!
如果有人能帮助我或告诉我,为什么迭代方式的输出不同,我将非常感激!
迭代版本使用以下数据输入进行测试
1: 1234
2: 123456789012345678901234
3: 1234567890123456789012345678901234567890123
输出:
1:正确
1234
2:正确
12345678901234567890
1234
3: 错误
12345678901234567890
12345678901234567890**123**
123
<xsl:template match="reportId">
<xsl:variable name="reportId" select="."/>
<xsl:choose>
<xsl:when test="string-length($reportId) > 21 and string-length($reportId) < 40">
<fo:block>
<xsl:value-of select="substring($reportId,1,20)" />
<fo:block/>
<xsl:value-of select="substring($reportId,21)" />
<fo:block/>
</fo:block>
</xsl:when>
<xsl:when test="string-length($reportId) > 41 and string-length($reportId) < 60">
<fo:block>
<xsl:value-of select="substring($reportId,1,20)" />
<fo:block/>
<xsl:value-of select="substring($reportId,21,40)" />
<fo:block/>
<xsl:value-of select="substring($reportId,41)" />
<fo:block/>
</fo:block>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$reportId"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
迭代版本
<xsl:template match="subId">
<xsl:param name="prev"/>
<xsl:choose>
<xsl:when test="$prev != ''">
<fo:block>
<xsl:value-of select="substring($prev,1,20)" />
</fo:block>
<xsl:call-template name="subId">
<xsl:with-param name="prev" select="substring($prev,21)"/>
</xsl:call-template>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="reportId">
<xsl:variable name="reportId" select="."/>
<xsl:call-template name="subId">
<xsl:with-param name="prev" select="$reportId"/>
</xsl:call-template>
</xsl:template>
您的指令:
<xsl:value-of select="substring($reportId,21,40)" />
returns 输入字符串中的 40 个字符,从字符 #21 开始。如果你想将你的输入分成 20 个字符的子字符串,你应该使用:
<xsl:value-of select="substring($reportId,21,20)" />
请注意,您的代码可以简化为:
<xsl:template match="reportId">
<fo:block>
<xsl:value-of select="substring(., 1, 20)" />
<fo:block/>
</fo:block>
<xsl:if test="string-length(.) > 20">
<fo:block>
<xsl:value-of select="substring(., 21, 20)" />
<fo:block/>
</fo:block>
</xsl:if>
<xsl:if test="string-length(.) > 40">
<fo:block>
<xsl:value-of select="substring(., 41)" />
<fo:block/>
</fo:block>
</xsl:if>
</xsl:template>
更好的是,使用真正的递归模板 - 参见示例: