当前位置: 首页 > 面试题库 >

需要XSL文件将内部xml测试格式转换为Junit格式(jenkins的xUnit插件)

赵志
2023-03-14
问题内容

我正在尝试编写XSL,将我的XML转换为jenkins采取的JUNIT格式(请参见下文)

我的xml看起来像这样:(我有几个“类”,例如“数据中心”或“网络”)

<tests>
   <Datacenters>             
        <test_name>Create NFS Data Center</test_name>
    <end_time>2011-06-13 01:22:55</end_time>
    <iter_num>1</iter_num>
    <start_time>2011-06-13 01:22:52</start_time>
    <status>Pass</status>
   </Datacenters>
   <Datacenters>             
    <test_name>Create NFS Data Center</test_name>
    <end_time>2011-06-13 01:22:55</end_time>
    <iter_num>1</iter_num>
    <start_time>2011-06-13 01:22:52</start_time>
    <status>Pass</status>
   </Datacenters>
   <Network>             
    <test_name>Network test 1</test_name>
    <end_time>2011-06-13 01:22:57</end_time>
    <iter_num>1</iter_num>
    <start_time>2011-06-13 01:22:52</start_time>
    <status>Pass</status>
   </Network>
   .....
 </tests>

我从WebUI插件中获取了XSL,并尝试对其进行了更改,但距离我只有一半,但这仍然很棘手。到目前为止,这是我所做的:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">

    <xsl:output method="xml" indent="yes" />    
    <xsl:template match="/">
    <testsuites>

     <! -- need to change /Datacenters to something else so it will work on all nodes -->
      <xsl:variable name="buildName" select="//tests/Datacenters/test_name"/>   
      <xsl:variable name="numOfTests" select="count(//tests/Datacenters/iter_num)"/>
      <xsl:variable name="numOfFail" select="count(//tests/Datacenters/status [.= 'Fail'])" />  
      <xsl:variable name="numberSkip" select="count(//tests/Datacenters/status [.!='Pass' and .!='Fail'])" />

 <testsuite name="QE AUTOMATION TESTS [DATACENTERS]"
                tests="{$numberOfTests}" time="0"
                failures="{$numberOfFailures}"  errors="0"
                skipped="{$numberSkipped}">

                <xsl:for-each select="//rest/Datacenters">
                    <xsl:variable name="testName" select="test_name"/>
                    <xsl:variable name="executionId" select="iter_num"/>
                    <xsl:variable name="start_time" select="fn:replace(start_time,' ','T')" />
                    <xsl:variable name="end_time" select="fn:replace(end_time,' ','T')"/>
                    <xsl:variable name="test_parameters" select="test_parameters"/>
                    <xsl:variable name="test_positive" select="test_positive"/>
                    <xsl:variable name="time_diff" select="xs:dateTime($end_time)-xs:dateTime($start_time)"/>
                    <xsl:variable name="duration_seconds" select="seconds-from-duration($time_diff)"/>
                    <xsl:variable name="duration_minutes" select="minutes-from-duration($time_diff)"/>  
                    <xsl:variable name="duration_hours" select="hours-from-duration($time_diff)"/>      
                    <xsl:variable name="outcome" select="status"/>  
                    <xsl:variable name="message" select="$buildName"/>  
                    <!--<xsl:variable name="className" select="Data"/>  -->
                                <testcase classname="Datacenters"
                                    name="{$testName}"
                                    time="{$duration_hours*3600 + $duration_minutes*60 + $duration_seconds }">

                                    <xsl:if test="contains($outcome, 'Fail')"> 
                                        <failure>
                                               test_parameters: <xsl:value-of select="$test_parameters" />
                                               test_positive: <xsl:value-of select="$test_positive" />
                                        </failure>
                                    </xsl:if>
                            </testcase>
                </xsl:for-each>

    </testsuite>
    </testsuites>
        </xsl:template>
    </xsl:stylesheet>

我要实现的是这个xml:

  <testsuites xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <testsuite name="Datacenters" tests="2" time="4" failures="0" errors="0" skipped="0">
            <testcase classname="Datacenters" name="Create NFS Data Center" time="3"/>
            <testcase classname="Datacenters" name="Create ISCSI Data Center" time="1"/>
        </testsuite>
        <testsuite name="Network" tests="1" time="5" failures="0" errors="0" skipped="0">
            <testcase classname="Datacenters" name="Network test 1" time="5"/>
        </testsuite>
    </testsuites>

但我不知道如何在所有“类”上进行迭代,因此我希望它不呈现“数据中心”的所有现有子级,而不是对其进行硬编码 <tests>


问题答案:

我只想回答模板中的注释(您的代码可能需要调试和重构):

   <!-- need to change /Datacenters to something 
          else so it will work on all nodes -->

为了避免硬编码:

1) 像这样替换XPath:

//tests/Datacenters/test_name

//tests/*/test_name

2) 修正迭代(完全错误),应为:

<xsl:for-each select="//tests/Datacenters">

而你想要:

 <xsl:for-each select="//tests/*">

3) 最后,请更换:

 <testcase classname="Datacenters">

 <testcase classname="{local-name(.)}">

评论后编辑

我将以简化的输出进行回答,只是向您展示 XSLT 2.0中 分组的工作方式。希望这个答案对您来说是可以接受的,您的实际模板在这里很难测试:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output indent="yes"/>

    <xsl:template match="tests">
        <testsuites>
            <xsl:for-each-group select="*" group-by="local-name()">
                <testsuite name="{current-grouping-key()}">
                    <xsl:for-each   select="current-group()">
                        <testcase classname="{current-grouping-key()}"/>
                    </xsl:for-each>
                </testsuite>
            </xsl:for-each-group>
        </testsuites>   
    </xsl:template>

</xsl:stylesheet>

应用于问题中提供的输入样本,将产生:

<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
   <testsuite name="Datacenters">
      <testcase classname="Datacenters"/>
      <testcase classname="Datacenters"/>
   </testsuite>
   <testsuite name="Network">
      <testcase classname="Network"/>
   </testsuite>
</testsuites>


 类似资料:
  • 我尝试将h264附件B转换为AVCC:我从附件流中提取了SPS和PPS,并创建了额外的数据。然后在流中查找0x00 0x00 0x00 0x00 0x01(这应该是每个Nal的开始),并继续查找另一个0x00 0x00 0x00 0x01(这将是Nal的结束),然后减去值以获得Nal长度,然后将第一个0x00 0x00 0x00 0x00 0x01替换为0x00 0x00 0x00 0x00[Nu

  • 本文向大家介绍Python实现把xml或xsl转换为html格式,包括了Python实现把xml或xsl转换为html格式的使用技巧和注意事项,需要的朋友参考一下 前些天用python处理xml的转换的一个小程序,用来把xml,xsl转换成html。 用的libxml2,所以还要先安装了libxml2模块才能使用。

  • 问题内容: 我正在尝试将Shift_JIS格式的文件转换为UTF-8格式。为此,下面是我的方法: 读取Shift_JIS文件 每行的getBytes并将其转换为UTF-8 创建新文件并将UTF-8转换后的值写入该文件 问题是在第2步中没有发生转换。我正在使用下面的代码将Shift_JIS转换为UTF-8: 请让我知道是否需要其他信息。 我有以下两个 问题 : 1.还有其他更好的方法(步骤)来执行此

  • 问题内容: 我有一个格式化的XML文件,我想将其转换为一个行字符串,我该怎么做。 样本XML: 预期产量 提前致谢。 问题答案: 使用StringBuilder比concat更有效http://kaioa.com/node/59

  • 问题内容: 我有一个在Windows环境中开发的应用程序。该应用程序本身已部署到Linux环境。每次部署此应用程序时,都必须使用dos2unix将可执行文件转换为UNIX格式。我最初以为这是Windows CP1252编码引起的,所以我更新了Maven以将文件编码为UTF-8。这并不能解决我的问题,我很快通过搜索此站点发现与回车和换行有关。有没有办法让Maven在构建过程中将所有文件转换为UNIX

  • 问题内容: 我收到了JSON文件,但不知道如何读取。有转换器可以在其中生成漂亮的CSV文件,以便将其加载到MS Excel中吗?我不懂JSON,所以如果有人编写脚本或将我链接到可以完成此任务的脚本,那将非常棒。 我在http://json.bloople.net上找到了一些接近的东西,但是不幸的是,它是JSON到HTML。 编辑:jsonformat.com越来越近,但是它仍然不是CSV。 问题答