You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:16:49