xml - 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,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)" />
从输入字符串返回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>
更好的是,使用真正的递归模板 - 参见例如:
https ://stackoverflow.com/a/60522091/3016153
推荐阅读
- javascript - 通过 jquery 在邮件内容中发送 html 页面
- ruby-on-rails - webpacker 5.x 无法编译 Angular 13 应用程序
- c# - 在 Xamarin 中动态更改条目输入的 Tab 键顺序
- reporting-services - SSRS - 是否可以过滤字段值但仍将其他值返回为空或空格?
- plotly.js - 为什么 PlotlyJS 不适用于谷歌浏览器?
- java - 在 JList 中过滤和突出显示时出现问题
- java - HCL Nomad Web:不支持 HTTP 响应内容类型
- php - PHP:无法使用 localhost:4000 创建新的文本文件
- c# - 将一个结构的成员复制到另一个 C#
- c++ - 重新排序链接库如何修复多个定义错误?