XSLT实现:为指定XML元素添加连续编号及文本的方法
解决XSLT中为带id的元素生成连续编号文本的问题
核心思路
要实现带连续编号的输出,XSLT内置的<xsl:number>元素是最直接的方案,它可以精准统计符合条件的节点位置。针对你的需求,需要:
- 匹配带
id属性的<parent>元素(而非直接匹配<Children>) - 用
<xsl:number>统计这类<parent>的连续序号 - 拼接指定格式的文本并生成
<fo:block>
修正后的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <!-- 匹配根节点,触发后续模板 --> <xsl:template match="/input"> <xsl:apply-templates select="parent[@id]"/> </xsl:template> <!-- 匹配带id属性的parent元素 --> <xsl:template match="parent[@id]"> <fo:block> <!-- 拼接文本:静态前缀 + 连续编号 + Children元素内容 --> <xsl:value-of select="concat('Parent ', xsl:number(count='parent[@id]', level='any'), ' ', Children/text())"/> </fo:block> <!-- 保留原有的子节点处理逻辑 --> <xsl:apply-templates select="example_child"/> </xsl:template> <!-- 处理example_child及子节点(可根据需求调整) --> <xsl:template match="example_child | child"> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet>
代码解释
<xsl:number>的使用:count='parent[@id]':指定只统计带有id属性的<parent>元素,确保编号仅针对符合条件的节点level='any':忽略层级,全局统计所有符合条件的<parent>,保证编号连续
模板匹配调整:
- 原代码匹配
<parent/Children>,但id属性属于<parent>,因此改为直接匹配带id的<parent>,逻辑更清晰 - 通过
<xsl:apply-templates select="parent[@id]"/>精准筛选需要处理的节点
- 原代码匹配
输出结果
应用上述XSLT到你的XML后,会生成如下内容:
<fo:block>Parent 1 Children of Parent id 100</fo:block> <fo:block>Parent 2 Children of Parent id 180</fo:block> <!-- 后续example_child及child节点的输出(根据模板保留) -->
内容的提问来源于stack exchange,提问作者priyanka manogaran
相关产品推荐
相关产品推荐

