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

如何为xsl:number设置count参数实现多文档表格行编号?

多文档XML下XSL-FO表格行编号失效的解决办法

方法1:XSLT 1.0全局节点计数

XSLT 1.0里xsl:number默认只在当前分支计数,多文档结构下每个dxl:document是独立分支,得用全局节点集来统计:

  • 先定义一个key,匹配所有表格行对应的dxl:item:
<xsl:key name="all-table-rows" match="dxl:item[你的行筛选条件]" use="'all'"/>
  • 生成行编号时,统计当前节点之前所有匹配的全局节点再加1:
<fo:table-cell>
  <fo:block>
    <xsl:value-of select="count(key('all-table-rows', 'all')[. << current()]) + 1"/>
  </fo:block>
</fo:table-cell>

<<是节点顺序比较运算符,用来判断当前节点在全局节点集中的位置。

方法2:XSLT 2.0+用xsl:number跨分支计数

如果用的是XSLT 2.0及以上,直接扩展xsl:number的计数范围,让它跨所有dxl:document累计:

<fo:table-cell>
  <fo:block>
    <xsl:number level="any" count="dxl:item[你的行筛选条件]" from="/"/>
  </fo:block>
</fo:table-cell>

level="any"会匹配整个文档树里符合条件的所有节点,from="/"指定从根节点开始遍历,自然就能跨文档累计编号。

方法3:递归模板传递累计计数

这种方法不依赖XSLT版本,兼容性拉满:

  • 定义处理表格行的模板,接收计数参数:
<xsl:template match="dxl:item[你的行筛选条件]">
  <fo:table-row>
    <fo:table-cell>
      <fo:block><xsl:value-of select="$current-count"/></fo:block>
    </fo:table-cell>
    <!-- 其他单元格的生成逻辑 -->
  </fo:table-row>
  <!-- 处理下一行,计数+1 -->
  <xsl:apply-templates select="following-sibling::dxl:item[你的行筛选条件]">
    <xsl:with-param name="current-count" select="$current-count + 1"/>
  </xsl:apply-templates>
</xsl:template>
  • 调用模板时初始计数设为1:
<xsl:apply-templates select="//dxl:item[你的行筛选条件]">
  <xsl:with-param name="current-count" select="1"/>
</xsl:apply-templates>

补充说明

  • 把代码里的你的行筛选条件换成你实际判断表格行的规则,比如特定子节点、属性值等。
  • 如果需要每个dxl:document内独立编号,调整对应的范围即可:比如把from="/"改成from="dxl:document",或者限制key的匹配范围到当前dxl:document下。

内容的提问来源于stack exchange,提问作者Joesse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 19:48:10