如何在XSLT中实现匹配<info>标签时自动分页?
在XSLT(XSL-FO)中实现标签分页显示的正确方法
你使用的break-before="page"属性是正确的,但当前代码的问题在于,带有分页属性的<fo:block>没有包裹住<info>标签的内容,导致分页规则无法生效。
修正后的核心模板写法
将<xsl:apply-templates>放到带有分页属性的<fo:block>内部,确保<info>的所有内容都受分页规则影响:
<xsl:template match="catalog/info"> <fo:block break-before="page"> <xsl:apply-templates/> </fo:block> </xsl:template>
完整可运行的XSLT示例
要让分页正常工作,还需要构建完整的XSL-FO文档结构(包含页面布局、页面序列等必要定义),以下是适配你XML的完整代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:output method="xml" indent="yes"/> <!-- 处理根节点,生成FO文档框架 --> <xsl:template match="/"> <fo:root> <!-- 定义A4页面布局 --> <fo:layout-master-set> <fo:simple-page-master master-name="default-page" page-width="210mm" page-height="297mm"> <fo:region-body margin="20mm"/> </fo:simple-page-master> </fo:layout-master-set> <!-- 页面序列,关联布局模板 --> <fo:page-sequence master-reference="default-page"> <fo:flow flow-name="xsl-region-body"> <!-- 遍历处理所有cd和info节点 --> <xsl:apply-templates select="catalog/cd | catalog/info"/> </fo:flow> </fo:page-sequence> </fo:root> </xsl:template> <!-- 渲染cd节点内容 --> <xsl:template match="cd"> <fo:block margin-bottom="10mm"> <fo:block font-weight="bold">标题: <xsl:value-of select="title"/></fo:block> <fo:block>艺术家: <xsl:value-of select="artist"/></fo:block> <fo:block>国家: <xsl:value-of select="country"/></fo:block> </fo:block> </xsl:template> <!-- 带分页的info节点渲染模板 --> <xsl:template match="catalog/info"> <fo:block break-before="page"> <fo:block font-weight="bold" font-size="14pt">专辑信息</fo:block> <fo:block>发行公司: <xsl:value-of select="company"/></fo:block> <fo:block>价格: <xsl:value-of select="price"/></fo:block> <fo:block>年份: <xsl:value-of select="year"/></fo:block> </fo:block> </xsl:template> </xsl:stylesheet>
关键说明
break-before="page":该属性会指示XSL-FO处理器在当前块之前插入分页符,确保<info>内容从新页面开始。- 必须将
<info>的内容(或<xsl:apply-templates>)包裹在带有分页属性的<fo:block>中,否则分页规则不会作用于目标内容。 - 完整的XSL-FO结构是分页生效的前提,处理器需要依赖页面布局、页面序列等定义来生成正确的分页文档。
内容的提问来源于stack exchange,提问作者priyanka manogaran
相关产品推荐
相关产品推荐

