Как добавить значения из XML в отправляемый по электронной почте HTML-отчет TestNG с помощью xslt

У меня просто есть динамический 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>

Скриншот:

Как добавить значения из XML в отправляемый по электронной почте HTML-отчет TestNG с помощью xslt Это образец моментального снимка для существующего представления 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>

Любые зацепки ...

Можете ли вы добавить именно тот HTML-код, который вы ищете, из xml?

Navarasu 28.10.2018 16:58

Вы просто хотите поместить вводимый xml в td или хотите, чтобы каждый столбец был отдельным td?

Navarasu 28.10.2018 17:03

Это простые HTML-теги отчетов, отправляемые по электронной почте. Я просто хочу добавить весь xml в <tbody>. <td> мне нужно вставить каждый тег из XML. Как и первый <td> testcaseId </td>, второй <message> и <exception>

ArrchanaMohan 28.10.2018 17:06

Нужна еще одна деталь, как повторяется <testCaseId>? Можете ли вы обновить вопрос с помощью двух значений тестового набора и родительского тега? так что мы можем сделать xsl для повторяющихся строк с тегом tr

Navarasu 28.10.2018 17:10

Обновил детали.

ArrchanaMohan 28.10.2018 17:18

Можете ли вы обновить html, к которому нужно добавить несколько данных? где это нужно обновить. Выше не ясно

Navarasu 28.10.2018 17:42

да. Я собираюсь обновить свой вопрос с помощью html

ArrchanaMohan 28.10.2018 17:59

Позвольте нам продолжить обсуждение в чате.

Navarasu 28.10.2018 18:03

прикрепил отчет. Я просто хочу добавить значения xml сразу после <table class = "result"> <tr class = "param"> <th> Parameter # 1 </th> </tr> <tr class = "param stripe"> <td> CSPDDataObject [testCaseId = US_KINDLE_22, description = РИСК с этапом выполнения AUTH] </td> </tr> <tr> <th> Сообщения </th> </tr> <tr> <td> <div class = "messages"> {ЗДЕСЬ НАХОДИТСЯ НЕКОТОРЫЕ СООБЩЕНИЕ ОТ РЕГИСТРАТОРА} </div> </td> </tr> <tr> <th> Исключение </th> </tr> <tr> <td> <div class = " stacktrace "> java.lang.AssertionError: ожидалось [true], но найдено [false] </div> </td> </tr> </table>

ArrchanaMohan 28.10.2018 18:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
9
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот xslt будет читать html-файл и добавлять xml-узлы после table [@ class = 'result']. При обработке HTML-кода тип документа вызовет ошибку. Поэтому перед запуском 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")
        }

Позвольте мне прикрепить отчет, отправленный по электронной почте

ArrchanaMohan 28.10.2018 17:45

Я обновил файл xsl. Напишите сценарий для удаления типа документа из отправляемого по электронной почте HTML-кода, чтобы игнорировать ошибку преобразователя dtd.

Navarasu 29.10.2018 00:35

Большое спасибо за ваш ответ. Позвольте мне это проверить. Можно ли запустить MAVEN вместо Gradle?

ArrchanaMohan 29.10.2018 02:53

Да, используйте этот плагин. mojohaus.org/xml-maven-plugin/examples/transform-saxon.html. Вы должны сказать спасибо, проголосовав за :)

Navarasu 29.10.2018 22:26

Напишите сценарий для удаления DOCTYPE из редактируемого файла HTML перед запуском xslt.

Navarasu 29.10.2018 22:27

Другие вопросы по теме