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"/>&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"/>&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>