Trini
Trini

Reputation: 419

looping in xslt using xpath

i want to loop through a xml file all the values are displayed while looping except //Script2[@time] it is in different position so i directly selected like that and for some reason i dont know //Script2[@time] is not displaying any value

 <table class="table_styling3">
 <tr><th>Name</th><th>Duration</th><th>Errors</th><th>Actions</th><th>Verifications</th>  <th>Traces</th></tr>
 <xsl:for-each select="Report/Scripts/Script1">
 <tr>
 <td widht="20%"><xsl:value-of select="@File"/></td>
 <td widht="20%"><xsl:value-of select="//Script2[@time]"/></td>
 <td width="10%"><xsl:value-of select="count(Message[@Type='Error'])"/></td>
 <td width="10%"><xsl:value-of select="count(Message[@Type='Action'])"/></td>
 <td width="10%"><xsl:value-of select="count(Message[@Type='Verification'])"/></td>
 <td width="10%"><xsl:value-of select="count(Message[@Type='Trace'])"/></td>
 </tr>
 </xsl:for-each>
 </table>

My xml file goes here

 <?xml version="1.0" encoding="utf-8"?>
 <Report App="RIATest" Version="4.7"   Project="D:\Projects\Automation\RIATest\Nomura\Nomura.rtp">
  <Startup>
  <Message Time="2012-08-30 15:32:38.578" Type="Info" Message="Launching iexplore.exe &quot;http://mobiuss-dev.operasolutions.com:8080/nomura-test/&quot;"/>
  <Message Time="2012-08-30 15:32:38.625" Type="Info" Message="Application launched (process id=4108)."/>
  <Message Time="2012-08-30 15:32:38.625" Type="Info" Message="Waiting for connection from agent..."/>
  <Message Time="2012-08-30 15:32:46.453" Type="Info" Message="Agent connection accepted. Application id=nomura-ui, index=0"/>
  </Startup>
  <Scripts>
  <Script1 File="Login.rts" Time="2012-08-30 15:32:46.468">
  <Message Time="2012-08-30 15:32:46.531" Type="Verification" Line="8" Col="58"   Message="Verification passed: SparkApplication(&quot;nomura-ui&quot;)=&gt;visible is equal  to true"/>
  <Message Time="2012-08-30 15:32:46.578" Type="Verification" Line="10" Col="50" Message="Verification passed: FlexForm(&quot;loginForm&quot;)=&gt;visible is equal to true"/>
  <Message Time="2012-08-30 15:32:46.625" Type="Verification" Line="12" Col="65" Message="Verification passed: FlexLabel(&quot;Username::Username:&quot;)=&gt;text is equal to &quot;Username:&quot;"/>
  <Message Time="2012-08-30 15:32:46.656" Type="Verification" Line="14" Col="65" Message="Verification passed: FlexLabel(&quot;Password::Password:&quot;)=&gt;text is equal to &quot;Password:&quot;"/>
  <Message Time="2012-08-30 15:32:46.671" Type="Verification" Line="17" Col="39" Message="Verification passed: comp=&gt;label is equal to &quot;Log In&quot;"/>
  <Message Time="2012-08-30 15:32:46.703" Type="Verification" Line="18" Col="35" Message="Verification passed: comp=&gt;enabled is equal to true"/>
  <Message Time="2012-08-30 15:32:46.718" Type="Verification" Line="19" Col="35" Message="Verification passed: comp=&gt;visible is equal to true"/>
  <Message Time="2012-08-30 15:32:46.734" Type="Verification" Line="22" Col="35" Message="Verification passed: comp=&gt;enabled is equal to true"/>
  <Message Time="2012-08-30 15:32:46.750" Type="Verification" Line="23" Col="54" Message="Verification passed: comp=&gt;label is equal to &quot;Forgot your password?&quot;"/>
  <Message Time="2012-08-30 15:32:46.765" Type="Verification" Line="24" Col="36" Message="Verification passed: comp=&gt;selected is equal to false"/>
  <Message Time="2012-08-30 15:32:46.781" Type="Verification" Line="25" Col="35" Message="Verification passed: comp=&gt;visible is equal to true"/>
  <Message Time="2012-08-30 15:32:46.796" Type="Verification" Line="28" Col="61" Message="Verification passed: comp=&gt;text is equal to &quot;CORPORATE BOND SPREAD SIGNAL&quot;"/>
  <Message Time="2012-08-30 15:32:46.812" Type="Verification" Line="29" Col="35" Message="Verification passed: comp=&gt;visible is equal to true"/>
  <Message Time="2012-08-30 15:32:46.906" Type="Action" Line="32" Col="64" Message="SparkTextInput(&quot;Username::userName&quot;)=&gt;textSelectionChange(0,0)"/>
  <Message Time="2012-08-30 15:32:47.000" Type="Action" Line="33" Col="63" Message="SparkTextInput(&quot;Username::userName&quot;)=&gt;textInput(&quot;arun.sekar&quot;)"/>
  <Message Time="2012-08-30 15:32:47.031" Type="Action" Line="35" Col="61" Message="SparkTextInput(&quot;Password::password&quot;)=&gt;textInput(&quot;opera100&quot;)"/>
  <Message Time="2012-08-30 15:32:47.093" Type="Action" Line="36" Col="32" Message="SparkButton(&quot;Log In&quot;)=&gt;click()"/>
  </Script>
  </Scripts>
  <Results>
  <Summary scripts="2" time="8.515" errors="2"/>
  <Script2 name="Login.rts" time="0.625" errors="0"/>
  <Script2 name="NOM_0002.rts" time="50.000" errors="2" message="Verification failed: comp=&gt;selected is not equal to expected value true, it is actually equal to false"/>
  </Results>
  </Report>

Insted of showing the time 0.625 in the first row and in the second row 50.000 it is displaying empty rows in the table and all other values are displayed as expected.

Upvotes: 0

Views: 437

Answers (1)

Tim C
Tim C

Reputation: 70648

You are currently doing this in your XSLT.....

<xsl:value-of select="//Script2[@time]"/>   

However, this will get the text value of the first Script2 tag which happens to have a @time@ attribute. I think you actually want to get the value of this @time attribute. In this case, do this...

<xsl:value-of select="//Script2/@time"/>   

But, from looking at your XSLT, it is possible you want to get the the Script2 tag which happens to have the same @name as the @File attribute of the Script1 tag.

<xsl:value-of select="//Script2[@name=current()/@File]/@time"/>

Try this stylesheet

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="/">
      <table class="table_styling3">
         <tr>
            <th>Name</th>
            <th>Duration</th>
            <th>Errors</th>
            <th>Actions</th>
            <th>Verifications</th>
            <th>Traces</th>
         </tr>
         <xsl:for-each select="Report/Scripts/Script1">
            <tr>
               <td width="20%">
                  <xsl:value-of select="@File"/>
               </td>
               <td width="20%">
                  <xsl:value-of select="//Script2[@name=current()/@File]/@time"/>
               </td>
               <td width="10%">
                  <xsl:value-of select="count(Message[@Type='Error'])"/>
               </td>
               <td width="10%">
                  <xsl:value-of select="count(Message[@Type='Action'])"/>
               </td>
               <td width="10%">
                  <xsl:value-of select="count(Message[@Type='Verification'])"/>
               </td>
               <td width="10%">
                  <xsl:value-of select="count(Message[@Type='Trace'])"/>
               </td>
            </tr>
         </xsl:for-each>
      </table>
   </xsl:template>
</xsl:stylesheet>

When applied to your sample XML, the following is output

<table class="table_styling3">
<tr>
<th>Name</th>
<th>Duration</th>
<th>Errors</th>
<th>Actions</th>
<th>Verifications</th>
<th>Traces</th>
</tr>
<tr>
<td width="20%">Login.rts</td>
<td width="20%">0.625</td>
<td width="10%">0</td>
<td width="10%">4</td>
<td width="10%">13</td>
<td width="10%">0</td>
</tr>
</table>

Actually, it would be more efficient to use an xsl:key here to look up the script2 elements

<xsl:key name="script" match="Script2" use="@name"/>

Try this XSLT instead. Notice I ahave also replaced the xsl:for-each with xsl:apply-templates which is often more in the 'spirit' of XSLT.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:key name="script" match="Script2" use="@name"/>
   <xsl:template match="/">
      <table class="table_styling3">
         <tr>
            <th>Name</th>
            <th>Duration</th>
            <th>Errors</th>
            <th>Actions</th>
            <th>Verifications</th>
            <th>Traces</th>
         </tr>
         <xsl:apply-templates select="Report/Scripts/Script1"/>
      </table>
   </xsl:template>

   <xsl:template match="Script1">
      <tr>
         <td width="20%">
            <xsl:value-of select="@File"/>
         </td>
         <td width="20%">
            <xsl:value-of select="key('script',@File)/@time"/>
         </td>
         <td width="10%">
            <xsl:value-of select="count(Message[@Type='Error'])"/>
         </td>
         <td width="10%">
            <xsl:value-of select="count(Message[@Type='Action'])"/>
         </td>
         <td width="10%">
            <xsl:value-of select="count(Message[@Type='Verification'])"/>
         </td>
         <td width="10%">
            <xsl:value-of select="count(Message[@Type='Trace'])"/>
         </td>
      </tr>
   </xsl:template>
</xsl:stylesheet>

Upvotes: 0

Related Questions