master
  1<?xml version="1.0" encoding="utf-8"?>
  2<xsl:stylesheet version="1.0"
  3                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  4                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  5                xmlns:g="http://www.gallio.org/"
  6                xmlns="http://www.w3.org/1999/xhtml">
  7  <!-- This parameter configures whether progress bars show a proportional division
  8       of color bars by status code or to show a single solid color -->
  9  <xsl:param name="use-proportional-progress-bars" select="false" />
 10  
 11  <xsl:template match="g:report" mode="xhtml-document">
 12    <html xml:lang="en" lang="en" dir="ltr">
 13      <head>
 14        <title>Gallio Test Report</title>
 15        <link rel="stylesheet" type="text/css" href="{$cssDir}Gallio-Report.css" />
 16        <script type="text/javascript" src="{$jsDir}Gallio-Report.js">
 17          <xsl:comment> comment inserted for Internet Explorer </xsl:comment>
 18        </script>
 19      </head>
 20      <body class="gallio-report">
 21        <xsl:apply-templates select="." mode="xhtml-body" />
 22      </body>
 23    </html>
 24  </xsl:template>
 25  
 26  <xsl:template match="g:report" mode="html-document">
 27    <xsl:call-template name="strip-namespace">
 28      <xsl:with-param name="nodes"><xsl:apply-templates select="." mode="xhtml-document" /></xsl:with-param>
 29    </xsl:call-template>
 30  </xsl:template>
 31
 32  <xsl:template match="g:report" mode="xhtml-fragment">
 33    <div class="gallio-report">
 34      <!-- Technically a link element should not appear outside of the "head"
 35           but most browsers tolerate it and this gives us better out of the box
 36           support in embedded environments like CCNet since no changes need to
 37           be made to the stylesheets of the containing application.
 38      -->
 39      <link rel="stylesheet" type="text/css" href="{$cssDir}Gallio-Report.css" />
 40      <script type="text/javascript" src="{$jsDir}Gallio-Report.js">
 41        <xsl:comment> comment inserted for Internet Explorer </xsl:comment>
 42      </script>
 43      
 44      <xsl:apply-templates select="." mode="xhtml-body" />
 45    </div>
 46  </xsl:template>
 47
 48  <xsl:template match="g:report" mode="html-fragment">
 49    <xsl:call-template name="strip-namespace">
 50      <xsl:with-param name="nodes"><xsl:apply-templates select="." mode="xhtml-fragment" /></xsl:with-param>
 51    </xsl:call-template>
 52  </xsl:template>
 53
 54  
 55  <xsl:template match="g:report" mode="xhtml-body">
 56    <div id="header">
 57      <h1></h1>
 58    </div>
 59    <xsl:apply-templates select="g:package/g:assemblyFiles" />
 60    <xsl:apply-templates select="g:packageRun" mode="statistics" />
 61    <xsl:apply-templates select="g:packageRun" mode="summary"/>
 62    <xsl:apply-templates select="g:packageRun" mode="details"/>
 63  </xsl:template>
 64
 65  <xsl:template match="g:package/g:assemblyFiles">
 66    <div id="Assemblies" class="section">
 67      <h2>Assemblies</h2>
 68      <div class="section-content">
 69        <ul>
 70          <xsl:for-each select="g:assemblyFile">
 71            <li>
 72              <xsl:value-of select="."/>
 73            </li>
 74          </xsl:for-each>
 75        </ul>
 76      </div>
 77    </div>
 78  </xsl:template>
 79
 80  <xsl:template match="g:packageRun" mode="statistics">
 81    <div id="Statistics" class="section">
 82      <h2>Statistics</h2>
 83      <div id="statistics-section-content" class="section-content">
 84        <table class="statistics-table">
 85          <tr>
 86            <td class="statistics-label-cell">
 87              Start time:
 88            </td>
 89            <td>
 90              <xsl:call-template name="format-datetime">
 91                <xsl:with-param name="datetime" select="@startTime" />
 92              </xsl:call-template>
 93            </td>
 94          </tr>
 95          <tr class="alternate-row">
 96            <td class="statistics-label-cell">
 97              End time:
 98            </td>
 99            <td>
100              <xsl:call-template name="format-datetime">
101                <xsl:with-param name="datetime" select="@endTime" />
102              </xsl:call-template>
103            </td>
104          </tr>
105          <xsl:apply-templates select="g:statistics" />
106        </table>
107      </div>
108    </div>
109  </xsl:template>
110
111  <xsl:template match="g:statistics">
112    <tr>
113      <td class="statistics-label-cell">
114        Tests:
115      </td>
116      <td>
117        <xsl:value-of select="@testCount" /> (<xsl:value-of select="@stepCount" /> steps)
118      </td>
119    </tr>
120    <tr class="alternate-row">
121      <td class="statistics-label-cell">
122        Results:
123      </td>
124      <td>
125        <xsl:call-template name="format-statistics">
126          <xsl:with-param name="statistics" select="." />
127        </xsl:call-template>
128      </td>
129    </tr>
130    <tr>
131      <td class="statistics-label-cell">
132        Duration:
133      </td>
134      <td>
135        <xsl:value-of select="format-number(@duration, '0.00')" />s
136      </td>
137    </tr>
138    <tr class="alternate-row">
139      <td class="statistics-label-cell">
140        Assertions:
141      </td>
142      <td>
143        <xsl:value-of select="@assertCount" />
144      </td>
145    </tr>
146  </xsl:template>
147
148  <xsl:template match="g:packageRun" mode="summary">
149    <div id="Summary" class="section">
150      <h2>Summary</h2>
151      <div class="section-content">
152        <xsl:choose>
153          <xsl:when test="g:testStepRun/g:children/g:testStepRun">
154            <ul>
155              <xsl:apply-templates select="g:testStepRun/g:children/g:testStepRun" mode="summary" />
156            </ul>
157          </xsl:when>
158          <xsl:otherwise>
159            <em>This report does not contain any test runs.</em>
160          </xsl:otherwise>
161        </xsl:choose>
162      </div>
163    </div>
164  </xsl:template>
165
166  <xsl:template match="g:testStepRun" mode="summary">
167    <xsl:variable name="id" select="g:testStep/@id" />
168    <xsl:variable name="testId" select="g:testStep/@testId" />
169    <xsl:variable name="test" select="ancestor::g:report/g:testModel/descendant::g:test[@id = $testId]" />
170    
171    <xsl:if test="g:testStep/@isTestCase='false'">
172      <xsl:variable name="statisticsRaw">
173        <xsl:call-template name="aggregate-statistics">
174          <xsl:with-param name="test" select="$test" />
175          <xsl:with-param name="testStepRun" select="." />
176        </xsl:call-template>
177      </xsl:variable>
178      <xsl:variable name="statistics" select="msxsl:node-set($statisticsRaw)/g:statistics" />
179
180      <li>
181        <div>
182          <xsl:choose>
183            <xsl:when test="g:children/g:testStepRun">
184              <xsl:call-template name="toggle">
185                <xsl:with-param name="href">summaryPanel-<xsl:value-of select="$id"/></xsl:with-param>
186              </xsl:call-template>
187            </xsl:when>
188            <xsl:otherwise>
189              <xsl:call-template name="toggle-stop" />
190            </xsl:otherwise>
191          </xsl:choose>
192
193          <!--
194          <xsl:call-template name="icon">
195            <xsl:with-param name="kind" select="$kind" />
196          </xsl:call-template>
197          -->
198
199          <a href="#testStepRun-{$id}"><xsl:value-of select="g:testStep/@name" /></a>
200
201          <xsl:call-template name="visual-statistics">
202            <xsl:with-param name="statistics" select="$statistics" />
203          </xsl:call-template>
204        </div>
205
206        <xsl:if test="g:children/g:testStepRun">
207          <ul id="summaryPanel-{$id}">
208            <xsl:apply-templates select="g:children/g:testStepRun" mode="summary" />
209          </ul>
210        </xsl:if>
211      </li>
212    </xsl:if>
213  </xsl:template>
214
215  <xsl:template match="g:packageRun" mode="details">
216    <div id="Details" class="section">
217      <h2>Details</h2>
218      <div class="section-content">
219        <xsl:choose>
220          <xsl:when test="g:testStepRun/g:children/g:testStepRun">
221            <ul class="testStepRunContainer">
222              <xsl:apply-templates select="g:testStepRun/g:children/g:testStepRun" mode="details" />
223            </ul>
224          </xsl:when>
225          <xsl:otherwise>
226            <em>This report does not contain any test runs.</em>
227          </xsl:otherwise>
228        </xsl:choose>
229      </div>
230    </div>
231  </xsl:template>
232
233  <xsl:template match="g:testStepRun" mode="details">
234    <xsl:variable name="id" select="g:testStep/@id" />
235    <xsl:variable name="testId" select="g:testStep/@testId" />
236    <xsl:variable name="test" select="ancestor::g:report/g:testModel/descendant::g:test[@id = $testId]" />
237    
238    <xsl:variable name="metadataEntriesFromTest" select="$test/g:metadata/g:entry" />
239    <xsl:variable name="metadataEntriesFromTestStep" select="g:testStep/g:metadata/g:entry" />
240    
241    <xsl:variable name="kind" select="$metadataEntriesFromTest[@key='TestKind']/g:value" />    
242    <xsl:variable name="nestingLevel" select="count(ancestor::g:testStepRun)" />
243    
244    <xsl:variable name="statisticsRaw">
245      <xsl:call-template name="aggregate-statistics">
246        <xsl:with-param name="test" select="$test" />
247        <xsl:with-param name="testStepRun" select="." />
248      </xsl:call-template>
249    </xsl:variable>
250    <xsl:variable name="statistics" select="msxsl:node-set($statisticsRaw)/g:statistics" />
251
252    <li id="testStepRun-{$id}">
253      <div class="testStepRunHeading testStepRunHeading-Level{$nestingLevel}">
254        <xsl:call-template name="toggle">
255          <xsl:with-param name="href">testStepRunPanel-<xsl:value-of select="$id"/></xsl:with-param>
256        </xsl:call-template>
257        <!--
258        <xsl:call-template name="icon">
259          <xsl:with-param name="kind" select="$kind" />
260        </xsl:call-template>
261        -->
262
263        <xsl:value-of select="g:testStep/@name" />
264
265        <xsl:choose>
266          <xsl:when test="g:children/g:testStepRun">
267            <xsl:call-template name="visual-statistics">
268              <xsl:with-param name="statistics" select="$statistics" />
269            </xsl:call-template>
270          </xsl:when>
271          <xsl:otherwise>
272            <xsl:call-template name="outcomeBar">
273              <xsl:with-param name="status" select="g:result/g:outcome/@status" />
274            </xsl:call-template>
275          </xsl:otherwise>
276        </xsl:choose>
277      </div>
278
279      <div id="testStepRunPanel-{$id}" class="testStepRunPanel">
280        <xsl:choose>
281          <xsl:when test="$kind = 'Assembly' or $kind = 'Framework'">
282            <table class="statistics-table">
283              <tr class="alternate-row">
284                <td>Results:</td>
285                <td>
286                  <xsl:call-template name="format-statistics">
287                    <xsl:with-param name="statistics" select="$statistics" />
288                  </xsl:call-template>
289                </td>
290              </tr>
291              <tr>
292                <td>Duration:</td>
293                <td>
294                  <xsl:value-of select="format-number($statistics/@duration, '0.00')" />s
295                </td>
296              </tr>
297              <tr class="alternate-row">
298                <td>
299                  Assertions:
300                </td>
301                <td>
302                  <xsl:value-of select="$statistics/@assertCount" />
303                </td>
304              </tr>
305            </table>
306          </xsl:when>
307          <xsl:otherwise>
308            Duration: <xsl:value-of select="format-number($statistics/@duration, '0.00')" />s,
309            Assertions: <xsl:value-of select="$statistics/@assertCount"/>.
310          </xsl:otherwise>
311        </xsl:choose>
312
313        <xsl:choose>
314          <xsl:when test="g:testStep/@isPrimary='true'">
315            <xsl:call-template name="print-metadata-entries">
316              <xsl:with-param name="entries" select="$metadataEntriesFromTest|$metadataEntriesFromTestStep" />
317            </xsl:call-template>
318          </xsl:when>
319          <xsl:otherwise>
320            <xsl:call-template name="print-metadata-entries">
321              <xsl:with-param name="entries" select="$metadataEntriesFromTestStep" />
322            </xsl:call-template>
323          </xsl:otherwise>
324        </xsl:choose>
325
326        <div id="testStepRun-{g:testStepRun/g:testStep/@id}" class="testStepRun">
327          <xsl:apply-templates select="." mode="details-content" />
328        </div>
329
330        <xsl:if test="g:children/g:testStepRun">
331          <ul class="testStepRunContainer">
332            <xsl:apply-templates select="g:children/g:testStepRun" mode="details" />
333          </ul>
334        </xsl:if>
335      </div>
336    </li>
337  </xsl:template>
338
339  <xsl:template match="g:testStepRun" mode="details-content">
340    <xsl:apply-templates select="g:executionLog">
341      <xsl:with-param name="stepId" select="g:testStep/@id" />
342    </xsl:apply-templates>
343  </xsl:template>
344
345  <xsl:template match="g:metadata">
346    <xsl:call-template name="print-metadata-entries">
347      <xsl:with-param name="entries" select="g:entry" />
348    </xsl:call-template>
349  </xsl:template>
350
351  <xsl:template name="print-metadata-entries">
352    <xsl:param name="entries" />
353    <xsl:variable name="visibleEntries" select="$entries[@key != 'TestKind']" />
354
355    <xsl:if test="$visibleEntries">
356      <ul class="metadata">
357        <xsl:apply-templates select="$visibleEntries">
358          <xsl:sort select="translate(@key, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" lang="en" data-type="text" />
359          <xsl:sort select="translate(@value, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" lang="en" data-type="text" />
360        </xsl:apply-templates>
361      </ul>
362    </xsl:if>
363  </xsl:template>
364
365  <xsl:template match="g:entry">
366    <li>
367      <xsl:value-of select="@key" />: <xsl:value-of select="g:value" />
368    </li>
369  </xsl:template>
370
371  <xsl:template match="g:executionLog">
372    <xsl:param name="stepId" />
373
374    <xsl:if test="g:streams/g:stream">
375      <div id="log-{$stepId}" class="log">
376        <xsl:apply-templates select="g:streams/g:stream" mode="stream">
377          <xsl:with-param name="attachments" select="g:attachments" />
378        </xsl:apply-templates>
379        
380        <xsl:if test="g:attachments/g:attachment">
381          <div class="logAttachmentList">
382            Attachments: <xsl:for-each select="g:attachments/g:attachment">
383              <xsl:apply-templates select="." mode="link" /><xsl:if test="position() != last()">, </xsl:if>
384            </xsl:for-each>.
385          </div>
386        </xsl:if>
387      </div>
388    </xsl:if>
389  </xsl:template>
390
391  <xsl:template match="g:streams/g:stream" mode="stream">
392    <xsl:param name="attachments" />
393
394    <div class="logStream logStream-{@name}">
395      <span class="logStreamHeading">
396        <xsl:value-of select="@name" />
397      </span>
398
399      <xsl:apply-templates select="g:body" mode="stream">
400        <xsl:with-param name="attachments" select="$attachments" />
401      </xsl:apply-templates>
402    </div>
403  </xsl:template>
404
405  <xsl:template match="g:body" mode="stream">
406    <xsl:param name="attachments" />
407
408    <div class="logStreamBody">
409      <xsl:apply-templates select="g:contents" mode="stream">
410        <xsl:with-param name="attachments" select="$attachments" />
411      </xsl:apply-templates>
412    </div>
413  </xsl:template>
414
415  <xsl:template match="g:section" mode="stream">
416    <xsl:param name="attachments" />
417
418    <div class="logStreamSection">
419      <span class="logStreamSectionHeading">
420        <xsl:value-of select="@name"/>
421      </span>
422      <div>
423        <xsl:apply-templates select="g:contents" mode="stream">
424          <xsl:with-param name="attachments" select="$attachments" />
425        </xsl:apply-templates>
426      </div>
427    </div>
428  </xsl:template>
429
430  <xsl:template match="g:contents" mode="stream">
431    <xsl:param name="attachments" />
432
433    <xsl:apply-templates select="child::node()[self::g:text or self::g:section or self::g:embed]" mode="stream">
434      <xsl:with-param name="attachments" select="$attachments" />
435    </xsl:apply-templates>
436  </xsl:template>
437
438  <xsl:template match="g:text" mode="stream">
439    <xsl:param name="attachments" />
440
441    <div>
442      <xsl:call-template name="print-text-with-line-breaks">
443        <xsl:with-param name="text" select="text()" />
444      </xsl:call-template>
445    </div>
446  </xsl:template>
447
448  <xsl:template match="g:embed" mode="stream">
449    <xsl:param name="attachments" />
450    <xsl:variable name="attachmentName" select="@attachmentName" />
451    
452    <div class="logAttachmentEmbedding">
453      <xsl:apply-templates select="$attachments/g:attachment[@name=$attachmentName]" mode="embed" />
454    </div>
455  </xsl:template>
456
457  <xsl:template match="g:attachment" mode="embed">
458    <xsl:variable name="isImage" select="starts-with(@contentType, 'image/')" />
459    <xsl:choose>
460      <xsl:when test="$attachmentBrokerUrl != ''">
461        <xsl:variable name="attachmentBrokerQuery"><xsl:value-of select="$attachmentBrokerUrl"/>testStepId=<xsl:value-of select="../../../g:testStep/@id"/>&amp;attachmentName=<xsl:value-of select="@name"/></xsl:variable>
462        <xsl:choose>
463          <xsl:when test="$isImage">
464            <img src="{$attachmentBrokerQuery}" alt="Attachment: {@name}" />
465          </xsl:when>
466          <xsl:otherwise>
467            Attachment: <a href="{$attachmentBrokerQuery}"><xsl:value-of select="@name" /></a>
468          </xsl:otherwise>
469        </xsl:choose>
470      </xsl:when>
471      <xsl:when test="@contentDisposition = 'link'">
472        <xsl:variable name="attachmentUri"><xsl:call-template name="path-to-uri"><xsl:with-param name="path" select="@contentPath" /></xsl:call-template></xsl:variable>
473        <xsl:choose>
474          <xsl:when test="$isImage">
475            <img src="{$attachmentUri}" alt="Attachment: {@name}" />
476          </xsl:when>
477          <xsl:otherwise>
478            Attachment: <a href="{$attachmentUri}"><xsl:value-of select="@name" /></a>
479          </xsl:otherwise>
480        </xsl:choose>
481      </xsl:when>
482      <xsl:when test="@contentDisposition = 'inline' and $isImage and @encoding = 'base64'">
483        <img src="data:{@contentType};base64,{text()}" alt="Attachment: {@name}" />
484      </xsl:when>
485      <xsl:otherwise>
486        Attachment: <xsl:value-of select="@name" /> (n/a)
487      </xsl:otherwise>
488    </xsl:choose>
489  </xsl:template>
490  
491  <xsl:template match="g:attachment" mode="link">
492    <xsl:choose>
493      <xsl:when test="$attachmentBrokerUrl != ''">
494        <xsl:variable name="attachmentBrokerQuery"><xsl:value-of select="$attachmentBrokerUrl"/>testStepId=<xsl:value-of select="../../../g:testStep/@id"/>&amp;attachmentName=<xsl:value-of select="@name"/></xsl:variable>
495        <a href="{$attachmentBrokerQuery}"><xsl:value-of select="@name" /></a>
496      </xsl:when>
497      <xsl:when test="@contentDisposition = 'link'">
498        <xsl:variable name="attachmentUri"><xsl:call-template name="path-to-uri"><xsl:with-param name="path" select="@contentPath" /></xsl:call-template></xsl:variable>
499        <a href="{$attachmentUri}"><xsl:value-of select="@name" /></a>
500      </xsl:when>
501      <xsl:otherwise>
502        <xsl:value-of select="@name" /> (n/a)
503      </xsl:otherwise>
504    </xsl:choose>
505  </xsl:template>
506
507  <!--
508  <xsl:template name="icon">
509    <xsl:param name="kind" />
510
511    <img>
512      <xsl:choose>
513        <xsl:when test="$kind = 'Fixture'">
514          <xsl:attribute name="src">{$imgDir}Fixture.png</xsl:attribute>
515          <xsl:attribute name="alt">Fixture Icon</xsl:attribute>
516        </xsl:when>
517        <xsl:when test="$kind = 'Test'">
518          <xsl:attribute name="src">{$imgDir}Test.png</xsl:attribute>
519          <xsl:attribute name="alt">Test Icon</xsl:attribute>
520        </xsl:when>
521        <xsl:otherwise>
522          <xsl:attribute name="src">{$imgDir}Container.png</xsl:attribute>
523          <xsl:attribute name="alt">Container Icon</xsl:attribute>
524        </xsl:otherwise>
525      </xsl:choose>
526    </img>
527  </xsl:template>
528  -->
529
530  <!-- Outcome bar -->
531  <xsl:template name="outcomeBar">
532    <xsl:param name="status" />
533
534    <table class="outcomeBar">
535      <tr>
536        <td>
537          <div class="outcomeBar outcome-{$status}">
538            <xsl:text> </xsl:text>
539          </div>
540        </td>
541      </tr>
542    </table>
543  </xsl:template>
544  
545  <!-- Progress bar -->
546  <xsl:template name="progressBar">
547    <xsl:param name="passed" select="0"/>
548    <xsl:param name="failed" select="0"/>
549    <xsl:param name="inconclusive" select="0"/>
550    <xsl:param name="skipped" select="0"/>
551
552    <xsl:variable name="total" select="$passed + $failed + $inconclusive + $skipped" />
553
554    <table class="progressBar">
555      <tr>
556        <td>
557          <div class="progressBar">
558            <xsl:choose>
559              <xsl:when test="$use-proportional-progress-bars">
560                <xsl:if test="$passed > 0">
561                  <div class="progress-passed" style="width:{100.0 * $passed div $total}%" />
562                </xsl:if>
563                <xsl:if test="$failed > 0">
564                  <div class="progress-failed" style="width:{100.0 * $failed div $total}%" />
565                </xsl:if>
566                <xsl:if test="$inconclusive > 0">
567                  <div class="progress-inconclusive" style="width:{100.0 * $inconclusive div $total}%" />
568                </xsl:if>
569                <xsl:if test="$skipped > 0">
570                  <div class="progress-skipped" style="width:{100.0 * $skipped div $total}%" />
571                </xsl:if>                
572              </xsl:when>
573              <xsl:otherwise>
574                <xsl:choose>
575                  <xsl:when test="$failed > 0"><div class="progress-failed" style="width:100%" /></xsl:when>
576                  <xsl:when test="$inconclusive > 0"><div class="progress-inconclusive" style="width:100%" /></xsl:when>
577                  <xsl:when test="$passed > 0"><div class="progress-passed" style="width:100%" /></xsl:when>
578                  <xsl:otherwise><div class="progress-skipped" style="width:100%" /></xsl:otherwise>
579                </xsl:choose>
580              </xsl:otherwise>
581            </xsl:choose>
582          </div>
583        </td>
584      </tr>
585    </table>
586  </xsl:template>
587
588  <!-- Toggle buttons -->
589  <xsl:template name="toggle">
590    <xsl:param name="href" />
591    
592    <img src="{$imgDir}Minus.gif" class="toggle" id="toggle-{$href}" onclick="toggle('{$href}');" alt="Toggle Button" />
593  </xsl:template>
594  
595  <xsl:template name="toggle-stop">
596    <img src="{$imgDir}FullStop.gif" alt="Toggle Placeholder" />
597  </xsl:template>
598  
599  <!-- Displays visual statistics using a progress bar and outcome icons -->
600  <xsl:template name="visual-statistics">
601    <xsl:param name="statistics"/>
602    
603    <xsl:call-template name="progressBar">
604      <xsl:with-param name="passed">
605        <xsl:value-of select="$statistics/@passedCount" />
606      </xsl:with-param>
607      <xsl:with-param name="failed">
608        <xsl:value-of select="$statistics/@failedCount" />
609      </xsl:with-param>
610      <xsl:with-param name="inconclusive">
611        <xsl:value-of select="$statistics/@inconclusiveCount" />
612      </xsl:with-param>
613      <xsl:with-param name="skipped">
614        <xsl:value-of select="$statistics/@skippedCount" />
615      </xsl:with-param>
616    </xsl:call-template>
617    
618    <span class="outcome-icons">
619      <img src="{$imgDir}Passed.gif" />
620      <xsl:value-of select="$statistics/@passedCount" />
621      <img src="{$imgDir}Failed.gif" />
622      <xsl:value-of select="$statistics/@failedCount" />
623      <img src="{$imgDir}Ignored.gif" />
624      <xsl:value-of select="$statistics/@inconclusiveCount + $statistics/@skippedCount" />            
625    </span>
626  </xsl:template>
627  
628  <!-- Include the common report template -->
629  <xsl:include href="Gallio-Report.common.xsl" />  
630</xsl:stylesheet>