如何通过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
相关产品推荐
相关产品推荐

