0

xml ファイルをループしたい //Script2[@time] を除いて、ループ中にすべての値が表示されます。それは別の位置にあるため、そのように直接選択し、何らかの理由でわかりません //Script2[@time] はそうではありません任意の値を表示する

 <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>

私のxmlファイルはここにあります

 <?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>

最初の行に 0.625 を表示し、2 行目に 50.000 を表示する代わりに、テーブルに空の行が表示され、他のすべての値が期待どおりに表示されます。

4

1 に答える 1

0

現在、XSLTでこれを行っています.....

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

ただし、これはたまたま@time@属性を持つ最初のScript2タグのテキスト値を取得します。この@time属性の値を実際に取得したいと思います。この場合、これを行う...

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

しかし、XSLT を見ると、 Script1タグの@File属性と同じ@nameを持つScript2タグを取得したい可能性があります。

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

このスタイルシートを試してください

<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>

サンプル XML に適用すると、次のように出力されます。

<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>

実際には、ここでxsl:keyを使用してscript2要素を検索する方が効率的です。

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

代わりにこの XSLT を試してください。また、 xsl:for-eachxsl:apply-templatesに置き換えたことに注意してください。これは、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>
于 2012-09-18T10:07:16.790 に答える