如何检查递归步骤的最后一个数并为小于 n 的递归步骤创建一个空元素?

Posted

技术标签:

【中文标题】如何检查递归步骤的最后一个数并为小于 n 的递归步骤创建一个空元素?【英文标题】:How can I check last number of recursive step and create an empty element for the recursive step less than n? 【发布时间】:2021-12-19 10:22:53 【问题描述】:

输入, n=6 和 String = "TEST "text1" "equal" "text2"

我正在使用以下 xslt 代码,

<xsl:template name="SplitString">
<xsl:param name="text"/>
<xsl:param name="n"/>

<xsl:if test="$n > 0">
<xsl:element name ="P">
    <xsl:value-of select="substring-before(substring-after($text, '&quot;'), '&quot;')" />
</xsl:element>

<!--recursive call -->
<xsl:call-template name="SplitString">
    <xsl:with-param name="text" select="substring-after($text, '&quot;')" />
    <xsl:with-param name="n" select="$n - 1" />
</xsl:call-template>        
</xsl:if>

模板>

我得到的输出是,

<P>text1</P>
<P>   </P>
<P>equal</P>
<P>   </P>
<P>text2</P>
<P/>

有没有办法为 n=6 和 String = "TEST "text1" "equal" "text2" 获得以下输出?

<P>test1</P>
<P>equal</P>
<P>test2</P>
<P/>
<P/>
<P/>

【问题讨论】:

您的声明 String = "TEST "text1" "equal" "text2" 令人困惑,因为不清楚哪些引号是字符串本身的一部分。如果第一个引号是字符串的一部分,那么你得到的结果就不是你显示的结果。 【参考方案1】:

可能是这样的:

<xsl:template name="SplitString">
    <xsl:param name="text"/>
    <xsl:param name="n"/>
    <xsl:variable name="token" select="normalize-space(substring-before(substring-after($text, '&quot;'), '&quot;'))" />
    <xsl:choose>
        <xsl:when test="$n > 0 and $token">
            <P>
                <xsl:value-of select="$token" />
            </P>
            <xsl:call-template name="SplitString">
                <xsl:with-param name="text" select="substring-after($text, '&quot;')" />
                <xsl:with-param name="n" select="$n - 1" />
            </xsl:call-template>        
        </xsl:when>
        <xsl:when test="$n > 0 and $text">
            <xsl:call-template name="SplitString">
                <xsl:with-param name="text" select="substring-after($text, '&quot;')" />
                <xsl:with-param name="n" select="$n" />
            </xsl:call-template>        
        </xsl:when>
        <xsl:when test="$n > 0">
            <P/>
            <xsl:call-template name="SplitString">
                <xsl:with-param name="n" select="$n - 1" />
            </xsl:call-template>        
        </xsl:when>
    </xsl:choose>
</xsl:template>

注意:如果事先知道元素的名称,则不宜使用xsl:element

【讨论】:

非常感谢迈克尔的回答,它按要求工作。我非常感谢你的建议。谢谢一百万!!!

以上是关于如何检查递归步骤的最后一个数并为小于 n 的递归步骤创建一个空元素?的主要内容,如果未能解决你的问题,请参考以下文章

归并排序算法优化

0514数据结构--递归排序和查找

0514数据结构--递归排序和查找

算法学习——递归之快速排序

算法导论中,为啥合并排序的递归树的高度为lgn?

编写一递归函数求斐波那契数列的前40项