如何获取XSL FO表格中行列的计数与当前索引?解决索引重复问题
解决XSL FO表格行索引重复的问题
嘿,我来帮你搞定这个表格行索引重复的问题!你遇到的(a)(a)...重复渲染,核心原因是**position()的上下文不对**,导致每次拿到的索引都是1,自然模板每次都输出(a)。下面给你拆解问题和解决方案:
为什么position()失效了?
你当前的代码里,<fo:table-row>如果不是通过循环(比如<xsl:for-each>)或者模板匹配节点集合生成的,position()的上下文就不是“当前行在所有行中的位置”,而是当前节点在其父节点的子节点列表中的位置——如果每个<fo:table-row>都是手动写的静态节点,那每个row的position()都是1,这就导致了重复的(a)。
正确获取行索引的两种方法
方法1:用<xsl:for-each>循环生成行(最常用)
如果你的表格行是基于某个XML节点集合生成的,把<fo:table-row>放在<xsl:for-each>内部,此时position()的上下文就是循环的节点集合,能正确返回当前行的索引:
<fo:table> <fo:table-body> <!-- 这里的select要替换成你实际的行节点路径 --> <xsl:for-each select="your/row/nodes"> <fo:table-row> <fo:table-cell> <fo:block> <xsl:call-template name="sectionColumn"> <!-- 此时position()就是当前行的索引(1、2、3...) --> <xsl:with-param name="rowIndex" select="position()"/> </xsl:call-template> </fo:block> </fo:table-cell> </fo:table-row> </xsl:for-each> </fo:table-body> </fo:table>
方法2:用<xsl:number>获取位置(更可靠)
如果是用模板匹配来生成行,<xsl:number>能更精准地获取当前节点在匹配集合中的位置,哪怕中间有条件跳过某些行也能正确计数:
<xsl:template match="your/row/nodes"> <fo:table-row> <fo:table-cell> <fo:block> <xsl:call-template name="sectionColumn"> <xsl:with-param name="rowIndex" select="xsl:number(count='yes')"/> </xsl:call-template> </fo:block> </fo:table-cell> </fo:table-row> </xsl:template>
确保sectionColumn模板正确转换索引
最后,检查你的sectionColumn模板是否正确把数字转换成(a)(b)这种字母序列,这里给你一个简单的实现(支持1-26行):
<xsl:template name="sectionColumn"> <xsl:param name="rowIndex"/> <xsl:variable name="letterSet" select="'abcdefghijklmnopqrstuvwxyz'"/> <xsl:text>(</xsl:text> <!-- 根据索引截取对应字母 --> <xsl:value-of select="substring($letterSet, $rowIndex, 1)"/> <xsl:text>)</xsl:text> </xsl:template>
额外排查点
如果你是手动写死多个<fo:table-row>(不是动态生成),那必须手动给每个row传递不同的索引参数,比如:
<fo:table-row> <fo:table-cell> <fo:block> <xsl:call-template name="sectionColumn"> <xsl:with-param name="rowIndex" select="1"/> </xsl:call-template> </fo:block> </fo:table-cell> </fo:table-row> <fo:table-row> <fo:table-cell> <fo:block> <xsl:call-template name="sectionColumn"> <xsl:with-param name="rowIndex" select="2"/> </xsl:call-template> </fo:block> </fo:table-cell> </fo:table-row>
内容的提问来源于stack exchange,提问作者Paulie
相关产品推荐
相关产品推荐

