如何使用xslt将XML中的值附加到TestNG可通过电子邮件发送的HTML报告中

时间:2018-10-28 15:50:19

标签: java xslt testng

我只有一些动态XML文件,其值如下:

 <testCaseId>CSPDDataObject [testCaseId=US_KINDLE_22, description=RISK with AUTH-fulfillment phase]</testCaseId>
 <message>Some logger details</message>
 <exception>java.lang.AssertionError: expected [true] but found [false]</exception>

完整的XML结构:

 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <FailedDetails>
    <FailedMessage>
        <testCaseId>US_KINDLE_TC1</testCaseId>
        <message> some logger</message>
        <exception>java.lang.AssertionError: expected [true] but found [false]
        </exception>
     </FailedMessage>
     <FailedMessage>
        <testCaseId>US_KINDLE_TC2</testCaseId>
        <message> some logger</message>
        <exception>java.lang.AssertionError: expected [true] but found [false]
        </exception>
    </FailedMessage>
       ......(n) (It repeats 'n' times)
  </FailedDetails>

我只想将此值附加到以下标签中现有的testNG可通过电子邮件发送的报告中:

 <h3> </h3><table> <tr> <td> need to append the above one with respective tag value</td></tr></table>

屏幕截图:

enter image description here 这是现有html视图的示例快照。我只想在此标签旁边添加xml值。

可通过电子邮件发送的报告示例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>TestNG Report</title><style type="text/css">table {margin-bottom:10px;border-collapse:collapse;empty-cells:show}th,td {border:1px solid #009;padding:.25em .5em}th {vertical-align:bottom}td {vertical-align:top}table a {font-weight:bold}.stripe td {background-color: #E6EBF9}.num {text-align:right}.passedodd td {background-color: #3F3}.passedeven td {background-color: #0A0}.skippedodd td {background-color: #DDD}.skippedeven td {background-color: #CCC}.failedodd td,.attn {background-color: #F33}.failedeven td,.stripe .attn {background-color: #D00}.stacktrace {white-space:pre;font-family:monospace}.totop {font-size:85%;text-align:center;border-bottom:2px solid #000}</style></head><body><table><tr><th>Test</th><th># Passed</th><th># Skipped</th><th># Failed</th><th>Time (ms)</th><th>Included Groups</th><th>Excluded Groups</th></tr><tr><th colspan="7">TransferMoney-Suite</th></tr><tr><td><a href="#t0">KindleReaderTest</a></td><td class="num">41</td><td class="num">0</td><td class="num attn">17</td><td class="num">10,316,154</td><td></td><td></td></tr><tr class="stripe"><td><a href="#t1">Suite setup and teardown</a></td><td class="num">0</td><td class="num">0</td><td class="num">0</td><td class="num">2,521</td><td></td><td></td></tr><tr><th>Total</th><th class="num">41</th><th class="num">0</th><th class="num attn">17</th><th class="num">10,318,675</th><th colspan="2"></th></tr></table><table><thead><tr><th>Class</th><th>Method</th><th>Start</th><th>Time (ms)</th></tr></thead><tbody><tr><th colspan="4">TransferMoney-Suite</th></tr></tbody><tbody id="t0"><tr><th colspan="4">KindleReaderTest &#8212; failed</th></tr><tr class="failedeven"><td rowspan="17">com.amazon.e2e.device.os22</td><td><a href="#m0">KindleReaderTest</a></td><td rowspan="17">1540236982369</td><td rowspan="17">116625</td></tr><tr class="failedeven"><td><a href="#m1">KindleReaderTest</a></td></tr><tr class="failedeven"><td><a href="#m2">KindleReaderTest</a></td></tr><tr class="failedeven"><td><a href="#m3">KindleReaderTest</a></td></tr><tr class="failedeven"><td><a href="#m4">KindleReaderTest</a></td></tr><tr class="failedeven"><td><a href="#m5">KindleReaderTest</a></td></tr><tr class="failedeven"><td><a href="#m6">KindleReaderTest</a></td></tr><tr class="failedeven"><td><a href="#m7">KindleReaderTest</a></td></tr><tr class="failedeven"><td><a href="#m8">KindleReaderTest</a></td></tr><tr class="failedeven"><td><a href="#m9">KindleReaderTest</a></td></tr><tr class="failedeven"><td><a href="#m10">KindleReaderTest</a></td></tr><tr class="failedeven"><td><a href="#m11">KindleReaderTest</a></td></tr><tr class="failedeven"><td><a href="#m12">KindleReaderTest</a></td></tr><tr class="failedeven"><td><a href="#m13">KindleReaderTest</a></td></tr><tr class="failedeven"><td><a href="#m14">KindleReaderTest</a></td></tr><tr class="failedeven"><td><a href="#m15">KindleReaderTest</a></td></tr><tr class="failedeven"><td><a href="#m16">KindleReaderTest</a></td></tr><tr><th colspan="4">KindleReaderTest &#8212; passed</th></tr><tr class="passedeven"><td rowspan="41">com.amazon.e2e.device.os22</td><td><a href="#m17">KindleReaderTest</a></td><td rowspan="41">1540241421467</td><td rowspan="41">218092</td></tr><tr class="passedeven"><td><a href="#m18">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m19">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m20">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m21">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m22">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m23">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m24">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m25">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m26">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m27">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m28">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m29">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m30">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m31">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m32">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m33">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m34">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m35">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m36">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m37">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m38">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m39">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m40">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m41">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m42">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m43">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m44">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m45">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m46">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m47">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m48">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m49">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m50">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m51">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m52">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m53">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m54">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m55">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m56">KindleReaderTest</a></td></tr><tr class="passedeven"><td><a href="#m57">KindleReaderTest</a></td></tr></tbody><tbody id="t1"></tbody></table><h2>KindleReaderTest</h2><h3 id="m0">com.amazon.e2e.device.os22#KindleReaderTest</h3><table class="result"><tr class="param"><th>Parameter #1</th></tr><tr class="param stripe"><td>CSPDDataObject [testCaseId=US_KINDLE_22, description=RISK with AUTH-fulfillment phase]</td></tr><tr><th>Messages</th></tr><tr><td><div class="messages">{
  SOME LOGGER MESSAGE GOES HERE
}</div></td></tr><tr><th>Exception</th></tr><tr><td><div class="stacktrace">java.lang.AssertionError: expected [true] but found [false]
</div></td></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
<h2>Suite setup and teardown</h2></body></html>

任何线索...

1 个答案:

答案 0 :(得分:1)

此xslt将读取html文件,并将xml节点附加在table [@ class ='result']之后。在解析html时,doctype将导致错误。因此,在运行xlst之前,请删除html中的第一行。

XLS文件

<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.w3.org/1999/xhtml"
                xpath-default-namespace="http://www.w3.org/1999/xhtml">
    <xsl:output method="html" indent="yes" omit-xml-declaration="yes"
                doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
                doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" />
    <xsl:param name="failedxml.outputDir" />
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:variable name="doc" select="document($failedxml.outputDir)" />
    <xsl:template match="body/table[@class='result']">
        <xsl:copy-of select="."/>
        <xsl:for-each select="$doc/node()/child::element()">
            <table class="result">
                <tr class="param">
                    <th>Parameter #1</th>
                </tr>
                <tr class="param stripe">
                    <td> <xsl:value-of select ="child::element()[1]"/></td>
                </tr>
                <tr>
                    <th>Messages</th>
                </tr>
                <tr>
                    <td>
                        <div class="messages"><xsl:value-of select ="child::element()[2]"/></div>
                    </td>
                </tr>
                <tr>
                    <th>Exception</th>
                </tr>
                <tr>
                    <td>
                        <div class="stacktrace"><xsl:value-of select ="child::element()[3]"/></div>
                    </td>
                </tr>
            </table>

        </xsl:for-each>

    </xsl:template>
</xsl:stylesheet>

我用gradle之类的跑了,

configurations{ xslt }
dependencies {
    xslt    'net.sf.saxon:saxon:8.7'
}
task generateReport << {
    File reportDir=new File("${projectDir}/HTML_Reports")
    if(reportDir.exists()){
        reportDir.deleteDir()
    }
    reportDir.mkdir()

   File emailreport=new File("${projectDir}/emailable-report.html")
   // Write some script to remove DOCTYPE from html file before running xslt.

    ant.xslt(in: "${testReportDir.absolutePath}/emailable-report.html",
             style: "${projectDir.absolutePath}/merge_html.xsl",
             out: "${reportDir.absolutePath}/index.html",
             classpath: configurations.xslt.asPath) {
            param(name: 'failedxml.outputDir', expression:  "${projectDir.absolutePath}/failedtest.xml")
        }