Как применить XSLT к 2 XML-файлам, комбинируя их на основе тега «name»? - PullRequest
0 голосов
/ 12 марта 2012

У меня есть 2 XML-файла.ProjectLog.xml, который имеет следующие xml

<?xml version="1.0" encoding="UTF-8"?>
<ProjectLog>
  <ProjectLogItem id="0" pid="-1" nety="False">       
    <No>1</No>
    <Name><![CDATA[CanEnterInvoice]]></Name>
    <StartTime>12/03/2012 11:55:59</StartTime>
    <EndTime>12/03/2012 11:58:26</EndTime>
    <RunTime>0:02:26</RunTime>
    <Details>&lt;a href="#" onclick="top.logtree_openNode('{85E6CF42-8907-4565-B7C5-487AA089CE5C}')"&gt;Details&lt;/a&gt;</Details>
    <Messages/>
  </ProjectLogItem>     
</ProjectLog>

и root.xml

<?xml version="1.0" encoding="UTF-8"?>
<LogData name="DetailedTest" id="{719C8118-F2D1-4775-A46B-B9465ACBA1EC}" status="0">
  <Provider name="Project Log" schemaType="aqds:tree" href="ProjectLog.xml"/>
  <Provider name="Test Run Summary" schemaType="aqds:text" href="TestRunSummary.xml"/>
  <LogData name="CanEnterInvoice" id="{85E6CF42-8907-4565-B7C5-487AA089CE5C}" status="0">
    <Provider name="Project Log" schemaType="aqds:tree" href="CanEnterInvoice\ProjectLog.xml"/>
    <LogData name="Script Test Log [EnteringInvoice\EnteringInvoice]" id="{6B048A3D-0C3D-4FAC-9BA8-4703759F868D}" status="0">
      <Provider name="Test Log" schemaType="aqds:tree" href="CanEnterInvoice\ScriptTestLogEnteringInvoiceEnteringInvoice\TestLog.xml"/>
    </LogData>
  </LogData>
</LogData>

Эти 2 файла генерируются Testcomplete после выполнения тестов, и я нахожусь в процессе интеграции testcomplete сTeamCity.Я использую teamcity MSBuild для запуска тестов, а затем, как только эти файлы журналов сгенерированы, я использую XSLT для обработки ProjectLog.xml и создания текстового файла, который teamcity может читать и отображать результаты теста.Но когда результаты считываются из файла ProjectLog.xml, невозможно определить, был ли тест пройден / не пройден.поэтому мне нужно использовать файл root.xml, чтобы найти результат теста.Атрибут состояния в следующем XML-файле в файле root.xml

<LogData name="CanEnterInvoice" id="{85E6CF42-8907-4565-B7C5-487AA089CE5C}" status="0">

указывает, успешно ли прошел тест.Прямо сейчас у меня есть следующий XSLT, чтобы получить имя и продолжительность теста из ProjectLog.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"
encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
       <xsl:for-each select="ProjectLog/ProjectLogItem">      

       ##teamcity[testStarted name='<xsl:value-of select="Name"/>']
       ##teamcity[testFinished name='<xsl:value-of select="Name"/>' duration='<xsl:value-of select="RunTime"/>']       
         </xsl:for-each>           
</xsl:template>
</xsl:stylesheet> 

Но я не уверен, как обновить его, чтобы получить «status» из «root.xml» длякаждый тест.

Может кто-нибудь помочь, пожалуйста?

Спасибо.

1 Ответ

0 голосов
/ 13 марта 2012

Я не могу помочь вам с вашим вопросом о XSLT, но, случайно, у меня есть скрипт ( VBScript ), который получает сводку о текущем тестовом прогоне и переводит его в читаемый формат в текст файл. Этот скрипт должен быть указан как последний тестовый элемент в проекте. Надеюсь, это поможет.

Sub ShowSummary
  summary = GetSummary
  Log.Message summary
  Call aqFile.WriteToTextFile("c:\MySummaryFile.txt", summary, aqFile.ctANSI, True)
End Sub

Function GetSummary
  tempFolder = aqEnvironment.GetEnvironmentVariable("temp") & "\" & GetTickCount & "\"

  aqFileSystem.CreateFolder tempFolder
  Call Log.SaveResultsAs(tempFolder, lsXML)

  Set xDoc = Sys.OleObject("MSXML2.DOMDocument.4.0")
  xDoc.load(tempFolder & "RootLogData.dat")                                              
  summaryFileName = xDoc.selectSingleNode("//Node[@name='item 0']/Prp[@name='filename']/@value").text
  xDoc.load(summaryFileName)

  GetSummary = "Total: "    & xDoc.selectSingleNode("Nodes/Node[@name='root']/Node[@name='summary']/Node[@name='total']/Prp[@name='total']/@value").text & VbCrLf &_
               "Executed: " & xDoc.selectSingleNode("Nodes/Node[@name='root']/Node[@name='summary']/Node[@name='executed']/Prp[@name='total']/@value").text & VbCrLf &_
               "Passed: "   & VarToStr(VarToInteger(xDoc.selectSingleNode("Nodes/Node[@name='root']/Node[@name='summary']/Node[@name='passed']/Prp[@name='total']/@value").text) + 1) & VbCrLf &_
               "Failed: "   & xDoc.selectSingleNode("Nodes/Node[@name='root']/Node[@name='summary']/Node[@name='failed']/Prp[@name='total']/@value").text

  Set xDoc = Nothing
  Call aqFileSystem.DeleteFolder(tempFolder, True) 
End Function
...