需要XSL文件将内部xml测试格式转换为Junit格式(用于jenkins的xUnit插件)
我正试图编写一个XSL来将我的XML转换为jenkins采用的JUNIT格式(见下文) 我的xml如下所示: (我有几个“类”,如“数据中心”或“网络”)需要XSL文件将内部xml测试格式转换为Junit格式(用于jenkins的xUnit插件),xml,xslt,junit,jenkins,Xml,Xslt,Junit,Jenkins,我正试图编写一个XSL来将我的XML转换为jenkins采用的JUNIT格式(见下文) 我的xml如下所示: (我有几个“类”,如“数据中心”或“网络”) 创建NFS数据中心 2011-06-13 01:22:55 1. 2011-06-13 01:22:52 通过 创建NFS数据中心 2011-06-13 01:22:55 1. 2011-06-13 01:22:52 通过 网络测试1 2011-06-13 01:22:57 1. 2011-06-13 01:22:52 通过 .....
创建NFS数据中心
2011-06-13 01:22:55
1.
2011-06-13 01:22:52
通过
创建NFS数据中心
2011-06-13 01:22:55
1.
2011-06-13 01:22:52
通过
网络测试1
2011-06-13 01:22:57
1.
2011-06-13 01:22:52
通过
.....
我从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/*/test\u name
2)修复迭代(完全错误),应该是:
<xsl:for-each select="//tests/Datacenters">
你想要:
<xsl:for-each select="//tests/*">
3)最后,务必更换:
<testcase classname="Datacenters">
与
评论后编辑 我将用一个简化的输出来回答,只是为了向您展示分组在XSLT2.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>
您是要提供一个输出示例,还是认为每个人都知道(也许是背诵)什么是“jenkins喜欢的Junit格式”:?用更多信息更新了该线程,谢谢。“我成功地做到了,我得到的xml就是这个”,也许您也可以用正确的模板编辑模板:)太好了,我使用了你的建议,但我仍然缺少每个“类”的正确分组。我已经更新了这个问题,我希望它现在更清楚。这里有一个跟踪,显示如何根据需要对元素进行分组。
<testcase classname="Datacenters">
<testcase classname="{local-name(.)}">
<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>