XSLT递归拆分字符串如何过滤空值并生成指定数量的P标签
问题原因
你当前的递归逻辑会在每轮调用时强制生成一个<P>标签,拆分字符串时会把引号对之间的空白分隔符也作为有效内容提取,因此多输出了两个包含空白的<P>标签。
解决方案
调整递归逻辑,先过滤掉提取到的全空白内容,再用空标签补齐到指定的n个即可,修改后的代码如下:
<xsl:template name="SplitString"> <xsl:param name="text"/> <xsl:param name="n"/> <xsl:if test="$n > 0"> <!-- 提取当前第一个引号对的内容,去除首尾空白 --> <xsl:variable name="extractContent" select="normalize-space(substring-before(substring-after($text, '"'), '"'))"/> <!-- 提取剩余待处理的字符串 --> <xsl:variable name="remainingText" select="substring-after($text, '"')"/> <xsl:choose> <!-- 还有可提取的有效内容 --> <xsl:when test="contains($text, '"')"> <xsl:if test="$extractContent != ''"> <!-- 内容非空则生成带内容的P标签,剩余数量减1 --> <P> <xsl:value-of select="$extractContent"/> </P> <xsl:call-template name="SplitString"> <xsl:with-param name="text" select="$remainingText"/> <xsl:with-param name="n" select="$n - 1"/> </xsl:call-template> </xsl:if> <!-- 内容为空则跳过生成标签,剩余数量不变,继续处理后续字符串 --> <xsl:if test="$extractContent = ''"> <xsl:call-template name="SplitString"> <xsl:with-param name="text" select="$remainingText"/> <xsl:with-param name="n" select="$n"/> </xsl:call-template> </xsl:if> </xsl:when> <!-- 没有可提取的内容,直接生成剩余数量的空P标签 --> <xsl:otherwise> <P/> <xsl:call-template name="SplitString"> <xsl:with-param name="text" select="$remainingText"/> <xsl:with-param name="n" select="$n - 1"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:if> </xsl:template>
逻辑说明
- 用
normalize-space()处理提取到的内容,自动去除首尾空白,判断是否为有效内容 - 提取到空白内容时不生成标签,也不消耗剩余计数,继续处理后续字符串
- 字符串中没有引号对时,直接生成剩余数量的空
<P>标签,最终总数量正好等于输入的n值
测试你给出的输入参数时,会先提取到text1、equal、text2三个有效内容,剩余3个计数自动生成空标签,和你要求的目标输出完全一致。
内容的提问来源于stack exchange,提问作者Kaya Choudhary
相关产品推荐
相关产品推荐

