如何在XSL中检测选择/块无文本节点时显示‘无结果’
实现XSL中无文本节点时显示“无结果”的方案
要搞定这个需求,核心是通过XSL的条件判断来检测目标节点是否包含有效非空白文本,然后针对性输出内容。我结合你提供的现有代码片段,整理了两种常用的实现方式:
方式一:针对单个指定节点的判断
假设你要处理的是d:target-node这个节点(对应你代码里的d...),可以在你的<fo:block>里嵌套一个<xsl:choose>来做判断:
<xsl:choose> <xsl:when test="@pass='0' or @pass='1'"> <fo:block padding-top="1cm" font-weight="bold" margin-bottom="0.2cm">Header</fo:block> <fo:block margin-top="0.2cm" margin-bottom="0.2cm" border-bottom="1px solid #e1e1e1"> </fo:block> <fo:block margin-top="0.2cm" margin-bottom="0.2cm" padding-left="5px" padding-right="5px" padding-top="1px"> <xsl:choose> <!-- 用normalize-space()过滤空白字符,确保只有有效文本才显示 --> <xsl:when test="normalize-space(d:target-node) != ''"> <xsl:apply-templates select="d:target-node"/> </xsl:when> <xsl:otherwise> <xsl:text>无结果</xsl:text> </xsl:otherwise> </xsl:choose> </fo:block> </xsl:when> <!-- 这里可以保留你原有的xsl:otherwise逻辑(如果有的话) --> </xsl:choose>
关键细节说明:
normalize-space()函数会自动去除文本前后的空白,并且把中间的连续空白合并成单个空格。如果处理后结果为空字符串,就说明目标节点没有有效可读内容(只有空格、换行这类空白字符也算“无结果”)。- 如果你的需求是“节点不存在时也显示无结果”,可以把判断条件改成:
test="d:target-node and normalize-space(d:target-node) != ''",先判断节点存在,再检查文本有效性。
方式二:检查当前区块的整体内容
如果你的<fo:block>里可能包含多个节点,需要判断整个区块最终是否没有任何有效文本,可以直接检查当前上下文节点的内容:
<fo:block margin-top="0.2cm" margin-bottom="0.2cm" padding-left="5px" padding-right="5px" padding-top="1px"> <xsl:choose> <xsl:when test="normalize-space(.) != ''"> <!-- 正常应用模板或输出内容 --> <xsl:apply-templates select="d..."/> </xsl:when> <xsl:otherwise> <xsl:text>无结果</xsl:text> </xsl:otherwise> </xsl:choose> </fo:block>
这里的.代表当前上下文节点,normalize-space(.)会检查该节点下所有文本内容的有效性。
内容的提问来源于stack exchange,提问作者JPR
相关产品推荐
相关产品推荐

