如何在XSLT中分割字符串并避免生成空NP元素?
XSLT按双引号分割字符串避免生成空NP元素的解决方案
问题原因
当前代码的逻辑会将双引号之间的所有内容(包括纯空白内容)都识别为有效tag,当输入中出现"{equal}" "{test2}"这类相邻双引号中间仅存在空格的场景时,就会生成仅包含空白的<NP>元素。
修正方案
仅需在输出<NP>元素前增加纯空白过滤逻辑即可,修改后的模板代码如下:
<xsl:template name="SplitString"> <xsl:param name="text" select="''" /> <xsl:variable name="tag" select="substring-before(substring-after($text, '"'), '"')" /> <xsl:variable name="Remainder" select="substring-after($text, '"')" /> <xsl:choose> <!-- 仅当tag去除前后空白后不为空时,才生成NP元素 --> <xsl:when test="$tag != '' and normalize-space($tag) != ''"> <NP> <!-- 若需要保留tag原始空白格式,直接替换为$tag即可 --> <xsl:value-of select="normalize-space($tag)" /> </NP> </xsl:when> </xsl:choose> <!-- 剩余内容还存在双引号时才继续递归,避免无效遍历 --> <xsl:if test="$Remainder != '' and contains($Remainder, '"')"> <xsl:call-template name="SplitString"> <xsl:with-param name="text" select="$Remainder" /> </xsl:call-template> </xsl:if> </xsl:template>
补充说明
normalize-space()是XSLT内置函数,会自动去除字符串前后的空白,同时将中间连续的多个空白合并为单个空格。如果你只需要过滤全空白内容、不需要修改非全空白tag的内部格式,仅保留判断条件里的normalize-space($tag) != ''即可,<xsl:value-of>直接输出$tag。
内容的提问来源于stack exchange,提问作者Kaya Choudhary
相关产品推荐
相关产品推荐

