如何插入空行而不影响XSL-FO中的顺序

时间:2016-02-02 11:56:27

标签: xml xslt xsl-fo apache-fop

XML包含多个PrintSections,它们有多个Text和Barcode部分。我需要在第一个PrintSection (或至少每个PrintSection)之后输出一个空行,而不更改它们在XML中存在的顺序

XML

<Document>
    <PrintSection>
        <Text/>
        <Text/>
    </PrintSection>
    <PrintSection>
        <Text/>
        <Barcode/>
    </PrintSection>
    <PrintSection>
        <Text/>
        <Text/>
    </PrintSection>
</Document>

XSL

<xsl:template match="/">
.....
</xsl:template>

<xsl:template match="Text">
    <fo:block>
        <xsl:apply-templates select="Text1" />
    </fo:block>
</xsl:template>

<xsl:template match="Barcode">
    <fo:block>
        <xsl:apply-templates select="Barcode1" />
    </fo:block>
</xsl:template>

我尝试添加此

<xsl:template match="PrintSection">
    <fo:block>
        <xsl:apply-templates select="Text" />
        <xsl:apply-templates select="Barcode" />
        <fo:leader/>
    </fo:block>
</xsl:template>

这会插入一个空白行,但它会在最后打印条形码,从而改变自然顺序。

2 个答案:

答案 0 :(得分:2)

在除{1}之外的所有space-before上添加PrintSection属性(https://www.w3.org/TR/xsl11/#space-before):

<fo:template match="Document">
  <xsl:apply-templates select="PrintSection" />
</fo:template>

<fo:template match="PrintSection">
   <fo:block>
    <xsl:if test="position() > 1">
      <xsl:attribute name="space-before">1.4em</xsl:attribute>
    </xsl:attribute>
    <xsl:apply-templates />
  </fo:block>
</xsl:template>

Document的模板只是为了表明应该一次性选择所有PrintSection,以便position()中的test按预期工作。如果您的样本PrintSection之间的空白文本节点不是,那么无论如何会发生什么,Document显示的模板将是多余的。

答案 1 :(得分:1)

如何改变

<xsl:template match="PrintSection">
    <fo:block>
        <xsl:apply-templates select="Text" />
        <xsl:apply-templates select="Barcode" />
        <fo:leader/>
    </fo:block>
</xsl:template>

<xsl:template match="PrintSection">
    <fo:block>
        <xsl:apply-templates/>
        <fo:leader/>
    </fo:block>
</xsl:template>