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

使用XSLT如何为XML的父、子、孙元素分别分配唯一ID?

XSLT生成全局唯一孙元素ID解决方案

方案1(兼容XSLT 1.0)

通过统计前置节点总数实现全局唯一序号,完整核心模板代码如下:

<xsl:template match="ParentElement">
    <ParentElement>
        <xsl:for-each select="ChildElement">
            <ChildElement>
                <!-- 子元素ID按需求调整为100起递增 -->
                <Child_ID>
                    <xsl:value-of select="99 + position()"/>
                </Child_ID>
                <Name>
                    <xsl:value-of select="@name"/>
                </Name>
                <xsl:for-each select="GrandChildElement">
                    <GrandChild>
                        <id>
                            <!-- 统计当前孙元素之前所有孙元素总数 + 偏移值生成200起的唯一ID -->
                            <xsl:variable name="preTotalGrand" select="count(../../preceding-sibling::ChildElement/GrandChildElement) + position()"/>
                            <xsl:value-of select="199 + $preTotalGrand"/>
                        </id>
                        <Label>
                            <xsl:value-of select="concat(@parameter1, '-', @parameter2)"/>
                        </Label>
                    </GrandChild>
                </xsl:for-each>
            </ChildElement>
        </xsl:for-each>
    </ParentElement>
</xsl:template>

方案2(XSLT 2.0及以上简化版)

使用内置全局计数能力,代码更简洁:

<xsl:for-each select="GrandChildElement">
    <GrandChild>
        <id>
            <xsl:value-of select="199 + xsl:number(., level='any', count='GrandChildElement')"/>
        </id>
        <Label>
            <xsl:value-of select="concat(@parameter1, '-', @parameter2)"/>
        </Label>
    </GrandChild>
</xsl:for-each>

补充说明

  • 偏移值可灵活调整,比如需要子ID从1000起就改99为999,孙ID从300起就改199为299
  • 如需添加ID前缀,直接拼接字符串即可,例:<id>GC-<xsl:value-of select="199 + $preTotalGrand"/></id>
  • 两种方案生成的孙元素ID均按XML中节点出现顺序全局递增,无重复问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:15:02