微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XSL输出子字符串不同//递归不调用数据

如何解决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) &gt; 21 and string-length($reportId) &lt; 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) &gt; 41 and string-length($reportId) &lt; 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?