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

如何为XML属性转标签的XSLT模板添加重复标签唯一编号功能?

解决方案

要将重复标签转换为带编号的唯一标签,需要在原有XSLT模板基础上新增匹配元素节点的模板,通过计算当前元素在同级同名元素中的位置,将序号拼接在原标签名后生成唯一标识。

修改后的完整XSLT代码

<script type="text/xsl" id="myXsltTemplate">
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>

    <!-- 匹配所有节点,作为默认模板(被更具体的模板覆盖) -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 将属性转换为标签(保留原有功能) -->
    <xsl:template match="@*">
        <xsl:element name="{name()}"><xsl:value-of select="."/></xsl:element>
    </xsl:template>

    <!-- 处理重复元素,生成带编号的唯一标签 -->
    <xsl:template match="*">
        <!-- 计算当前元素在同级同名元素中的序号 -->
        <xsl:variable name="elementIndex" select="count(preceding-sibling::*[name()=name(current())]) + 1"/>
        <!-- 生成带编号的新元素名 -->
        <xsl:element name="{name()}{$elementIndex}">
            <!-- 继续处理当前元素的属性和子节点 -->
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>
  </xsl:stylesheet>
</script>

关键逻辑说明

  • 新增的<xsl:template match="*">模板优先级高于默认的match="@* | node()",会专门处理所有元素节点
  • count(preceding-sibling::*[name()=name(current())]) + 1:统计当前元素之前的同级同名元素数量,加1得到当前元素的序号(第一个同名元素序号为1,第二个为2,以此类推)
  • <xsl:element name="{name()}{$elementIndex}">:将原标签名与序号拼接,生成如image1、image2这类唯一标签
  • 内部的<xsl:apply-templates select="@* | node()"/>会继续触发属性转标签的模板,保留原有功能

示例效果

输入XML片段:

<root>
  <image src="pic1.jpg"/>
  <image src="pic2.jpg"/>
</root>

转换后输出:

<root1>
  <image1>
    <src>pic1.jpg</src>
  </image1>
  <image2>
    <src>pic2.jpg</src>
  </image2>
</root1>

内容的提问来源于stack exchange,提问作者Sylwester Zabielski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:24:57