将 XML 属性的值追加到同一文件中另一个属性的值

Append value of XML attribute to value of Another attribute in same file

提问人:Krishan Gopal 提问时间:6/8/2023 最后编辑:Krishan Gopal 更新时间:6/8/2023 访问量:34

问:

使用以下 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>

我想将失败类型值附加到测试用例的名称中。因此,上述 xml 中的失败值为“ERROR”,测试用例的名称为“Case 1”,结果名称为“[ERROR] Case 1”。我想通过所有测试用例的 shell 脚本来做到这一点。

注意:同一文件中可以有多个具有不同故障类型的测试用例。

所需的目标 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> 

到目前为止,我尝试的是基于目标 XML 创建 XSLT 文档并使用该 XSLT 生成目标 XML,但直到现在我都无法实现这一点。

我的 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="/">
<testsuites>
    <xsl:for-each select="/testsuites/testsuite">
<testsuite>
 <xsl:for-each select="./testcase">
  <testcase>
   <xsl:variable name="name" select="./@name"/>
   <!-- The variable name can be used for further processing.  -->
   <xsl:attribute name="name"><xsl:value-of select="$name"/></xsl:attribute>
    <failure>
     <xsl:value-of   select="./failure"/>
     <xsl:variable name="type" select="./failure/@type"/>
     <!-- The variable type can be used for further processing.  -->
     <xsl:attribute name="type"><xsl:value-of select="$type"/></xsl:attribute>
    </failure>
   </testcase>
</xsl:for-each>
</testsuite>
</xsl:for-each>
</testsuites>
</xsl:template>
</xsl:stylesheet>
XSLT XML 解析

评论


答:

1赞 y.arazim 6/8/2023 #1

我想将失败类型值附加到测试用例的名称中。

应该很简单:

<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>

<xsl:template match="testcase/@name">
    <xsl:attribute name="name">
        <xsl:text>[</xsl:text>
        <xsl:value-of select="../failure/@type" />
        <xsl:text>] </xsl:text>
        <xsl:value-of select="." />
    </xsl:attribute>
</xsl:template>

</xsl:stylesheet>

评论

0赞 Krishan Gopal 6/8/2023
这很神奇,您能否为以下原始 xml 编写类似的 xsl<testsuites disabled=“0” errors=“0” failures=“7” tests=“7” time=“0.0”> <testsuite disabled=“0” errors=“0” failures=“7” name=“semgrep results” skipped=“0” tests=“7” time=“0”> <testcase name=“generic.secrets.security.detected-etc-shadow.detected-etc-shadow” classname=“selftest/secrets/bad-secrets.txt” file=“selftest/secrets/bad-secrets.txt” line=“1”> <failure type=”ERROR“ message=”检测到 linux 影子文件“>root::17431:0:99999:7::: </failure> </testcase> </testsuites> </testsuites>
0赞 y.arazim 6/9/2023
对不起,我看不出这有什么不同。在我看来,相同的样式表可以用来产生类似的结果。如果没有,并且您无法自己进行必要的更改,请将其作为新问题发布。