如何在不影响 XSL-FO 中的顺序的情况下插入空行
how to insert a blank line without affecting the order in XSL-FO
XML 包含多个 PrintSections,它们有多个 Text 和 Barcode 部分。我需要在第一个 PrintSection(或至少每个 PrintSection)之后输出一个空行而不改变它们在[中的顺序 =27=]。
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>
这会插入一个空行,但会在最后打印条形码,从而改变自然顺序。
改一下怎么样
<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>
在除第一个之外的所有 PrintSection
上添加 space-before
属性 (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
,以便 test
中的 position()
可以按预期工作。如果不是样本中 PrintSection
之间的白色 space 文本节点,那么无论如何都会发生这种情况,并且为 Document
显示的模板将是多余的。
XML 包含多个 PrintSections,它们有多个 Text 和 Barcode 部分。我需要在第一个 PrintSection(或至少每个 PrintSection)之后输出一个空行而不改变它们在[中的顺序 =27=]。
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>
这会插入一个空行,但会在最后打印条形码,从而改变自然顺序。
改一下怎么样
<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>
在除第一个之外的所有 PrintSection
上添加 space-before
属性 (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
,以便 test
中的 position()
可以按预期工作。如果不是样本中 PrintSection
之间的白色 space 文本节点,那么无论如何都会发生这种情况,并且为 Document
显示的模板将是多余的。