<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" cdata-section-elements="system-out system-err" /> <!-- NUnit2 results format --> <xsl:template match="/test-results"> <testsuites> <xsl:for-each select="test-suite//results//test-case[1]"> <xsl:for-each select="../.."> <xsl:variable name="firstTestName" select="results/test-case[1]/@name" /> <xsl:variable name="testFixtureName"> <xsl:choose> <!-- we have a classic method name --> <xsl:when test="substring($firstTestName, string-length($firstTestName)) = ')'"> <xsl:value-of select="substring-before($firstTestName, concat('.', @name))"></xsl:value-of> </xsl:when> <!-- we have either a custom name, or a test name --> <xsl:otherwise> <xsl:variable name="testMethodName"> <xsl:call-template name="lastIndexOf"> <xsl:with-param name="string" select="$firstTestName" /> <xsl:with-param name="char" select="'.'" /> </xsl:call-template> </xsl:variable> <xsl:choose> <!-- If we didn't find any dot, it means we have just the test name --> <xsl:when test="$testMethodName=$firstTestName"> <xsl:value-of select="concat(substring-before($firstTestName, @name), @name)" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="substring-before($firstTestName, concat('.', $testMethodName))" /> </xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:variable> <!-- <xsl:variable name="testFixtureName" select="concat(substring-before($firstTestName, @name), @name)" /> --> <!-- <redirect:write file="{$outputpath}/TEST-{$testFixtureName}.xml">--> <testsuite name="{$testFixtureName}" tests="{count(*/test-case)}" time="{@time}" failures="{count(*/test-case/failure)}" errors="0" skipped="{count(*/test-case[@executed='False' or @result='Inconclusive'])}"> <xsl:for-each select="*/test-case"> <xsl:variable name="testcaseName"> <xsl:choose> <xsl:when test="contains(./@name, concat($testFixtureName,'.'))"> <xsl:value-of select="substring-after(./@name, concat($testFixtureName,'.'))"/><!-- We either instantiate a "15" --> </xsl:when> <xsl:otherwise> <xsl:value-of select="./@name"/><!-- ...or a "20" --> </xsl:otherwise> </xsl:choose> </xsl:variable> <testcase classname="{$testFixtureName}" name="{$testcaseName}"> <xsl:if test="@time!=''"> <xsl:attribute name="time"><xsl:value-of select="@time" /></xsl:attribute> </xsl:if> <xsl:variable name="generalfailure" select="./failure" /> <xsl:if test="./failure"> <xsl:variable name="failstack" select="count(./failure/stack-trace/*) + count(./failure/stack-trace/text())" /> <failure> <xsl:choose> <xsl:when test="$failstack > 0 or not($generalfailure)"> MESSAGE: <xsl:value-of select="./failure/message" /> +++++++++++++++++++ STACK TRACE: <xsl:value-of select="./failure/stack-trace" /> </xsl:when> <xsl:otherwise> MESSAGE: <xsl:value-of select="$generalfailure/message" /> +++++++++++++++++++ STACK TRACE: <xsl:value-of select="$generalfailure/stack-trace" /> </xsl:otherwise> </xsl:choose> </failure> </xsl:if> <xsl:if test="@executed='False' or @result='Inconclusive'"> <skipped> <xsl:attribute name="message"><xsl:value-of select="./reason/message"/></xsl:attribute> </skipped> </xsl:if> </testcase> </xsl:for-each> </testsuite> </xsl:for-each> </xsl:for-each> </testsuites> </xsl:template> <!-- NUnit3 results format --> <xsl:template match="/test-run"> <testsuites tests="{@testcasecount}" failures="{@failed}" disabled="{@skipped}" time="{@duration}"> <xsl:apply-templates/> </testsuites> </xsl:template> <xsl:template match="test-suite"> <xsl:if test="test-case"> <testsuite tests="{count(descendant::test-case)}" time="{@duration}" errors="{count(descendant::test-case) - @passed - @skipped - @failed - @inconclusive}" failures="{@failed}" skipped="{@skipped + @inconclusive}" timestamp="{@start-time}"> <xsl:attribute name="name"> <xsl:for-each select="ancestor-or-self::test-suite/@name"> <xsl:value-of select="concat(., '.')"/> </xsl:for-each> </xsl:attribute> <xsl:if test="output"> <xsl:apply-templates select="output" /> </xsl:if> <xsl:apply-templates select="test-case"/> </testsuite> <xsl:apply-templates select="test-suite"/> </xsl:if> <xsl:if test="not(test-case)"> <xsl:apply-templates/> </xsl:if> </xsl:template> <xsl:template match="test-case"> <testcase name="{@name}" assertions="{@asserts}" time="{@duration}" status="{@result}" classname="{@classname}"> <xsl:if test="@result = 'Skipped' or @runstate = 'Skipped' or @runstate = 'Ignored' or @runstate='Inconclusive'"> <skipped> <xsl:attribute name="message"> <xsl:value-of select="./reason/message"/> </xsl:attribute> </skipped> </xsl:if> <xsl:apply-templates/> </testcase> </xsl:template> <xsl:template match="command-line"/> <xsl:template match="settings"/> <xsl:template match="output"> <system-out> <xsl:copy-of select="./text()" /> </system-out> </xsl:template> <xsl:template match="stack-trace"> </xsl:template> <xsl:template match="test-case/failure"> <failure message="{./message}"> <xsl:value-of select="./stack-trace"/> </failure> </xsl:template> <xsl:template match="test-suite/failure"/> <xsl:template match="test-case/reason"> <skipped message="{./message}"/> </xsl:template> <xsl:template match="test-suite/reason"/> <xsl:template match="properties"/> <!-- source: https://www.oxygenxml.com/archives/xsl-list/200102/msg00838.html --> <xsl:template name="lastIndexOf"> <!-- declare that it takes two parameters - the string and the char --> <xsl:param name="string" /> <xsl:param name="char" /> <xsl:choose> <!-- if the string contains the character... --> <xsl:when test="contains($string, $char)"> <xsl:call-template name="lastIndexOf"> <xsl:with-param name="string" select="substring-after($string, $char)" /> <xsl:with-param name="char" select="$char" /> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$string" /> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>