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

如何使用XSLT为XML同名元素添加序号并重命名

为同名XML元素添加序号重命名的XSLT解决方案

我有多个同名的XML元素(例如<risks>),需要使用XSLT为这些元素添加序号,重命名为risks_1、risks_2这类带序号的形式。以下是输入XML、期望输出XML,以及我尝试但未成功的XSLT代码,恳请协助解决。

输入XML

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <score>0.8</score>
    <risks>5001</risks>
    <risks>1006</risks>
    <risks>1045</risks>
    ......
    <risks>1456</risks>
    <version>SCO</version>
 </response>

期望输出XML

<?xml version="1.0" encoding="UTF-8"?>
<response>
  <score>0.8</score>
  <risks_1>5001</risks_1>
  <risks_2>1006</risks_2>
  <risks_3>1045</risks_3>
  .....
  <risks_n>1456</risks_n>
  <version>SCO</version>
</response>

我尝试的XSLT代码(未成功)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    
    <xsl:template match="/response">
        <xsl:element name="SCO">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
    
    <xsl:template match="@* | node()">
        <xsl:choose>        
        <xsl:when test="local-name() = 'risks'"> 
            <xsl:element name="{concat({local-name()},format-number(count(preceding::risks)+1,'0')}"></xsl:element>
        </xsl:when>     
        </xsl:choose>
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

修正后的XSLT代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">

    <!-- 身份模板:复制所有未被特殊匹配的节点和属性 -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 专门匹配risks元素,重命名为带序号的形式 -->
    <xsl:template match="risks">
        <xsl:element name="{concat(local-name(), '_', position())}">
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

代码说明

  1. 身份模板:保留默认的节点复制逻辑,确保除risks外的所有元素、属性和文本都原样输出。
  2. risks元素处理:
    • 使用position()直接获取当前risks在同级节点中的位置序号,比count(preceding::risks)+1更高效。
    • 通过concat(local-name(), '_', position())拼接出新的元素名,比如risks_1、risks_2。
    • 复制原risks元素的所有属性和内部内容到新元素中。
  3. 根元素<response>保持不变,无需额外修改模板。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:37:51