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

如何通过Shell脚本将XML中failure的type值追加到testcase的name属性

批量修改XML中testcase的name属性解决方案

原始XML

<testsuites>
  <testsuite><testcase name="case 1" ><failure type="ERROR">Hello</failure></testcase></testsuite>
  <testsuite><testcase name="case 2" ><failure type="WARNING">Buddy</failure></testcase></testsuite>
</testsuites>

需求

将每个testcase节点下failure的type属性值追加到该testcase的name属性值前,格式为[TYPE] 原name,最终目标XML如下:

目标XML

<testsuites>
  <testsuite><testcase name="[ERROR] case 1" ><failure type="ERROR">Hello</failure></testcase></testsuite>
  <testsuite><testcase name="[WARNING] case 2" ><failure type="WARNING">Buddy</failure></testcase></testsuite>
</testsuites> 

原有XSLT的问题

你之前写的XSLT仅原样复制了原name和failure属性,没有完成type与name的拼接,且写法冗余,未利用XSLT的身份模板保留其他未修改内容。

正确的XSLT实现

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 身份模板:复制所有未被匹配的节点和属性 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- 专门匹配testcase节点,修改其name属性 -->
  <xsl:template match="testcase">
    <testcase>
      <!-- 拼接新的name属性:[failure的type] + 原name -->
      <xsl:attribute name="name">
        <xsl:text>[</xsl:text>
        <xsl:value-of select="failure/@type"/>
        <xsl:text>] </xsl:text>
        <xsl:value-of select="@name"/>
      </xsl:attribute>
      <!-- 复制testcase下的所有子节点和其他属性 -->
      <xsl:apply-templates select="@*[not(name()='name')]|node()"/>
    </testcase>
  </xsl:template>
</xsl:stylesheet>

Shell脚本批量处理命令

使用xsltproc工具执行转换(多数Linux系统默认安装,未安装可通过包管理器获取):

# 替换文件名:transform.xsl为你的XSLT文件,input.xml为原始XML,output.xml为生成的目标文件
xsltproc transform.xsl input.xml > output.xml

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:35:30