使用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
相关产品推荐
相关产品推荐

