当 table 正文中没有可用数据时,xsl fo 呈现空 Table 结构

xsl fo render Empty Table Structure when no Data is available in table Body

我正在使用 XSL FO 将 XML 文件中的数据转换为呈现为 PDF 文档的表格。如果 XML 中没有数据,我被要求呈现空的 table 结构 - 让 table 主体为空。

我尝试了下面的代码

        <!-- Addresses -->
            <fo:table border="1px solid black" table-layout="fixed" width="100%">
            <fo:table-column column-width="2in"/>
            <fo:table-column column-width="2in"/>
            <fo:table-column column-width="2.5in"/>
            <fo:table-column column-width="2.5in"/>             
            <fo:table-column column-width="2in"/>
            <fo:table-header>
                <fo:table-row>
                    <fo:table-cell border="0.1pt solid black" text-align="left" font-size="12pt" font-weight="bold" number-columns-spanned="5" background-color= "#B6B6B4"><fo:block>Addresses</fo:block></fo:table-cell>                                           
                </fo:table-row>
                        <fo:table-row>
                        <fo:table-cell border="0.1pt solid black" text-align="left" font-size="10pt" font-weight="bold">
                                <fo:block> Address Type </fo:block>
                            </fo:table-cell>
                            <fo:table-cell border="0.1pt solid black" text-align="left" font-size="10pt" font-weight="bold">
                                <fo:block> Fields</fo:block>
                            </fo:table-cell>                                
                            <fo:table-cell border="0.1pt solid black" text-align="left" font-size="10pt" font-weight="bold">
                                <fo:block> Values </fo:block>
                            </fo:table-cell>                                                
                            <fo:table-cell border="0.1pt solid black" text-align="left" font-size="10pt" font-weight="bold">
                                <fo:block> Data Source</fo:block>
                            </fo:table-cell>
                            <fo:table-cell border="0.1pt solid black" text-align="left" font-size="10pt" font-weight="bold">
                                <fo:block> DMC Doc Link</fo:block>
                            </fo:table-cell>                                                                                                                            
                        </fo:table-row>                            
                    </fo:table-header>
                    <fo:table-body>

                        <xsl:if test="core/clientMembers/address">
                            <xsl:apply-templates select="core/clientMembers/address"/>
                        </xsl:if>                               
                        <xsl:if test="not(core/clientMembers/address)">
                            <fo:table-row>
                            <fo:table-cell border="0.1pt solid black" text-align="left" font-size="9pt"><fo:block>Primary Address</fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                         </fo:table-row>                                
                         <fo:table-row>
                            <fo:table-cell border="0.1pt solid black" text-align="left" font-size="9pt"><fo:block>Incorporated Address</fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                            </fo:table-row>
                            <fo:table-row>
                            <fo:table-cell border="0.1pt solid black" text-align="left" font-size="9pt"><fo:block>Registered Address</fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                            </fo:table-row>
                            <fo:table-row>
                            <fo:table-cell border="0.1pt solid black" text-align="left" font-size="9pt"><fo:block>Mailing Address</fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                            <fo:table-cell border="0.1pt solid black"><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                            </fo:table-row>                                                                                                 
                        </xsl:if>
                    </fo:table-body>
                </fo:table>

但是这段代码没有按预期工作。 这里的专家能否请教是否有办法在 XSL FO 中实现所需的行为??? "core/clientMain/coverage" 是 xsl 模板。

鉴于您提供的代码,您所说的 "leaving the table body empty" 是什么意思有点不清楚。当然我可以相信,如果 XPath 表达式 core/clientMain/coverage 的计算结果为空节点集,它不会执行您想要的操作,因为它将在 <fo:table-body> 元素内生成一个 <fo:table-cell> child 元素,中间没有任何 <fo:table-row>.

我看得出来您想生成一行空单元格(显然其中有五个与五个标题相匹配),或者根本没有行,但是您提供的内容没有意义。

完全没有行的情况很简单:只需省略第二个 xsl:if 元素及其内容,只留下

                        <xsl:if test="core/clientMain/coverage">
                            <xsl:apply-templates select="core/clientMain/coverage"/>
                        </xsl:if>

(我假设该部分在实际有数据时按预期工作。)

如果您确实想提供一个空数据行,那就提供吧!详细信息取决于您的具体需求,但可能如下所示:

                    <xsl:if test="core/clientMain/coverage">
                        <xsl:apply-templates select="core/clientMain/coverage"/>
                    </xsl:if>
                    <xsl:if test="not(core/clientMain/coverage)">
                      <fo:table-row>
                        <fo:table-cell><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                        <fo:table-cell><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                        <fo:table-cell><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                        <fo:table-cell><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                        <fo:table-cell><fo:block white-space-treatment="preserve"><fo:leader /></fo:block></fo:table-cell>
                      </fo:table-row>
                    </xsl:if>