如何为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
相关产品推荐
相关产品推荐

