使用 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>