如何解决XSL输出子字符串不同//递归不调用数据
我需要对以下输入进行子字符串处理,但是对于迭代版本(排除了错误的数据!),第三种情况的输出是错误的。但是使用的方法是相同的。
如果有人可以帮助我或告诉我,为什么输出在迭代方式上有所不同,我将非常感激!
迭代版本已通过以下数据输入进行了测试
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,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,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)" />
从输入字符串中返回 40个字符,从字符#21开始。如果要将输入分为20个字符的子字符串,则应使用:
<xsl:value-of select="substring($reportId,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(.,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>
更好的是,使用真正的递归模板-例如:
https://stackoverflow.com/a/60522091/3016153
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。