XSL中for-each循环实现连续递增计数器及generate-id使用问题
解决XSL中Meeting节点遍历的ID问题
1. 实现全局连续递增ID替代position()
position()在for-each循环中仅返回当前循环内的相对位置,每次循环都会重置,导致ID无法全局连续。可以用以下两种方法解决:
使用
<xsl:number>统计全局Meeting节点
通过设置count="Meeting"和level="any",让编号统计所有层级下的Meeting节点,实现全局连续:<!-- 在模板或for-each内部 --> <button id="btn-{xsl:number count='Meeting' level='any'}">操作</button>这里的编号会从1开始,按所有Meeting节点的出现顺序依次递增,不受循环范围影响。
利用全局节点集合的索引(XSLT 2.0+)
先定义变量保存所有Meeting节点,再用index-of获取当前节点在全局集合中的位置:<!-- 顶层定义变量 --> <xsl:variable name="allMeetings" select="//Meeting"/> <!-- 在for-each循环内部 --> <xsl:for-each select="Meeting"> <button id="btn-{index-of($allMeetings, .)}">操作</button> </xsl:for-each>这种方法能精准匹配当前节点在全局列表中的位置,确保ID连续唯一。
2. 正确使用generate-id()生成唯一ID
如果输出了字面字符串generate-id(),说明你错误地将函数名作为字符串常量使用了,正确的调用方式需要将函数放在属性值模板或<xsl:value-of>中:
错误写法:直接把函数名写在引号里,导致输出字面字符串
<div id="generate-id()"></div>正确写法1:属性值模板
使用大括号{}包裹函数调用,让XSL解析执行函数:<div id="{generate-id()}"></div>正确写法2:显式使用
<xsl:value-of>
通过<xsl:attribute>或直接在元素内输出函数结果:<div> <xsl:attribute name="id"> <xsl:value-of select="generate-id()"/> </xsl:attribute> </div>generate-id()会为每个节点生成唯一的、不可重复的字符串ID,完全满足按钮与对应元素的绑定需求。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

