当 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>
我正在使用 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>