使用 XSL-FO 在下一个兄弟姐妹为空时隐藏块
Hiding block when the next sibiling is empty with XSL-FO
我正在使用 Apache FOP 生成报告,我的模板是这样的:
<xsl:template match="LOGO">
<xsl:param name="imgLogo">
<xsl:value-of select="IMG" />
</xsl:param>
<fo:external-graphic content-height="scale-to-fit"
height="50pt" src="{$imgLogo}" />
</xsl:template>
<xsl:template match="MYREPORT">
<fo:block>
<xsl:apply-templates select="LOGO" />
</fo:block>
<fo:block>
<xsl:value-of select="PAG_1" />
</fo:block>
<fo:block page-break-before="always">
<xsl:apply-templates select="LOGO" />
</fo:block>
<fo:block>
<xsl:value-of select="PAG_2" />
</fo:block>
<fo:block page-break-before="always">
<xsl:apply-templates select="LOGO" />
</fo:block>
<fo:block>
<xsl:value-of select="PAG_3" />
</fo:block>
</xsl:template>
如果下一个同级块 (PAGE) 为空,我必须隐藏“LOGO”块(在每个 PAGE 之前)。
例如,使用以下输入:
<MYREPORT>
<LOGO>
<IMG>data:image/png;base64,[cutted]</IMG>
</LOGO>
<PAG_1>Page 1</PAG_1>
<PAG_2>Page 2</PAG_2>
</MYREPORT>
它应该打印:
LOGO
Page 1
(new page)
LOGO
Page 2
它正在打印以下内容:
LOGO
Page 1
(new page)
LOGO
Page 2
(new page)
LOGO
有什么想法吗?谢谢
最直接的方法是在 PAG_3
的代码周围加上 xsl:if
:
<xsl:template match="MYREPORT">
<fo:block>
<xsl:apply-templates select="LOGO" />
</fo:block>
<fo:block>
<xsl:value-of select="PAG_1" />
</fo:block>
<fo:block page-break-before="always">
<xsl:apply-templates select="LOGO" />
</fo:block>
<fo:block>
<xsl:value-of select="PAG_2" />
</fo:block>
<xsl:if test="PAG_3">
<fo:block page-break-before="always">
<xsl:apply-templates select="LOGO" />
</fo:block>
<fo:block>
<xsl:value-of select="PAG_3" />
</fo:block>
</xsl:if>
</xsl:template>
另一种方法(我会使用)是使用 xsl:apply-templates
到 select PAG_* 元素,以便只为存在的元素生成结果:
<xsl:template match="MYREPORT">
<xsl:apply-templates select="PAG_1 | PAG_2 | PAG_3" />
</xsl:template>
<xsl:template match="PAG_1 | PAG_2 | PAG_3">
<fo:block>
<xsl:if test="position() != 1">
<xsl:attribute name="page-break-before">always</xsl:attribute>
</xsl:if>
<xsl:apply-templates select="../LOGO" />
</fo:block>
<fo:block>
<xsl:apply-templates />
</fo:block>
</xsl:template>
我正在使用 Apache FOP 生成报告,我的模板是这样的:
<xsl:template match="LOGO">
<xsl:param name="imgLogo">
<xsl:value-of select="IMG" />
</xsl:param>
<fo:external-graphic content-height="scale-to-fit"
height="50pt" src="{$imgLogo}" />
</xsl:template>
<xsl:template match="MYREPORT">
<fo:block>
<xsl:apply-templates select="LOGO" />
</fo:block>
<fo:block>
<xsl:value-of select="PAG_1" />
</fo:block>
<fo:block page-break-before="always">
<xsl:apply-templates select="LOGO" />
</fo:block>
<fo:block>
<xsl:value-of select="PAG_2" />
</fo:block>
<fo:block page-break-before="always">
<xsl:apply-templates select="LOGO" />
</fo:block>
<fo:block>
<xsl:value-of select="PAG_3" />
</fo:block>
</xsl:template>
如果下一个同级块 (PAGE) 为空,我必须隐藏“LOGO”块(在每个 PAGE 之前)。
例如,使用以下输入:
<MYREPORT>
<LOGO>
<IMG>data:image/png;base64,[cutted]</IMG>
</LOGO>
<PAG_1>Page 1</PAG_1>
<PAG_2>Page 2</PAG_2>
</MYREPORT>
它应该打印:
LOGO
Page 1
(new page)
LOGO
Page 2
它正在打印以下内容:
LOGO
Page 1
(new page)
LOGO
Page 2
(new page)
LOGO
有什么想法吗?谢谢
最直接的方法是在 PAG_3
的代码周围加上 xsl:if
:
<xsl:template match="MYREPORT">
<fo:block>
<xsl:apply-templates select="LOGO" />
</fo:block>
<fo:block>
<xsl:value-of select="PAG_1" />
</fo:block>
<fo:block page-break-before="always">
<xsl:apply-templates select="LOGO" />
</fo:block>
<fo:block>
<xsl:value-of select="PAG_2" />
</fo:block>
<xsl:if test="PAG_3">
<fo:block page-break-before="always">
<xsl:apply-templates select="LOGO" />
</fo:block>
<fo:block>
<xsl:value-of select="PAG_3" />
</fo:block>
</xsl:if>
</xsl:template>
另一种方法(我会使用)是使用 xsl:apply-templates
到 select PAG_* 元素,以便只为存在的元素生成结果:
<xsl:template match="MYREPORT">
<xsl:apply-templates select="PAG_1 | PAG_2 | PAG_3" />
</xsl:template>
<xsl:template match="PAG_1 | PAG_2 | PAG_3">
<fo:block>
<xsl:if test="position() != 1">
<xsl:attribute name="page-break-before">always</xsl:attribute>
</xsl:if>
<xsl:apply-templates select="../LOGO" />
</fo:block>
<fo:block>
<xsl:apply-templates />
</fo:block>
</xsl:template>