XSLT 2.0索引页开发问题:标题无法关联显示对应页码
解决XSLT 2.0索引页标题不显示对应页码的问题
你已经搞定了TOC标题和摘要的显示,现在就差把标题和对应页码绑定上了。核心问题是没有建立标题与对应内容块的页码关联逻辑,下面是具体的解决方案:
1. 先确认XML数据源的结构基础
首先要确保你的XML里,每个标题对应的内容块有唯一标识(比如id属性),并且包含页码信息(如果是静态页码),或者能让XSLT通过上下文定位到内容块(如果是动态生成的页码,比如XSL-FO场景)。举个典型的XML结构例子:
<document> <section id="sec-intro" page="3"> <title>Introduction to XSLT</title> <summary>Learn the basics of XSLT transformation...</summary> </section> <section id="sec-advanced" page="12"> <title>Advanced XSLT Techniques</title> <summary>Dive into keys, templates, and modular stylesheets...</summary> </section> <toc id="TOC" ref-id="TOC"/> </document>
2. 用XSLT Key建立标题与内容块的映射
为了高效关联TOC标题和对应内容块,建议用<xsl:key>创建索引,避免重复遍历XML:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 建立section节点id到节点本身的索引 --> <xsl:key name="section-by-id" match="section" use="@id"/> <!-- 主模板生成页面结构 --> <xsl:template match="/"> <div class="index-page"> <h1>Table of Contents</h1> <!-- 处理TOC节点 --> <xsl:apply-templates select="//toc[@id='TOC']"/> </div> </xsl:template> <!-- TOC条目生成模板 --> <xsl:template match="toc"> <ul class="toc-list"> <!-- 遍历所有section生成TOC条目 --> <xsl:for-each select="//section"> <li class="toc-item"> <!-- 显示标题 --> <span class="toc-title"><xsl:value-of select="title"/></span> <!-- 显示对应页码 --> <span class="toc-page">Page <xsl:value-of select="@page"/></span> <!-- 显示摘要 --> <p class="toc-summary"><xsl:value-of select="summary"/></p> </li> </xsl:for-each> </ul> </xsl:template> </xsl:stylesheet>
3. 动态页码场景(XSL-FO生成PDF)
如果你的页码是由XSL-FO处理器动态生成的(不是XML里的静态属性),不要手动计算页码,改用FO的<fo:page-number-citation>标签,它会自动关联内容块的id并输出正确页码:
<!-- 在FO模板中调整TOC条目部分 --> <xsl:template match="toc"> <fo:block> <fo:list-block> <xsl:for-each select="//section"> <fo:list-item> <fo:list-item-label end-indent="label-end()"> <fo:block><xsl:value-of select="title"/> </fo:block> </fo:list-item-label> <fo:list-item-body start-indent="body-start()"> <!-- 动态引用页码 --> <fo:block text-align-last="justify"> <fo:leader leader-pattern="dots"/> <fo:page-number-citation ref-id="{@id}"/> </fo:block> <fo:block><xsl:value-of select="summary"/></fo:block> </fo:list-item-body> </fo:list-item> </xsl:for-each> </fo:list-block> </fo:block> </xsl:template>
关键排查点
- 确保XML中内容块的
id是唯一的,且TOC的关联逻辑能正确匹配到这些id - 如果是动态页码场景,必须保证内容块的
id和page-number-citation的ref-id完全一致 - 检查XSLT的节点选择器是否正确,比如有没有选到所有需要的内容块
内容的提问来源于stack exchange,提问作者Ghanshyam Mule
相关产品推荐
相关产品推荐

