Home | History | Annotate | Download | only in etc
      1 <?xml version="1.0"?>
      2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
      3     xmlns:lxslt="http://xml.apache.org/xslt"
      4     xmlns:redirect="org.apache.xalan.lib.Redirect"
      5     xmlns:stringutils="xalan://org.apache.tools.ant.util.StringUtils"
      6     extension-element-prefixes="redirect">
      7 <xsl:output method="html" indent="yes" encoding="US-ASCII"/>
      8 <xsl:decimal-format decimal-separator="." grouping-separator=","/>
      9 <!--
     10    Licensed to the Apache Software Foundation (ASF) under one or more
     11    contributor license agreements.  See the NOTICE file distributed with
     12    this work for additional information regarding copyright ownership.
     13    The ASF licenses this file to You under the Apache License, Version 2.0
     14    (the "License"); you may not use this file except in compliance with
     15    the License.  You may obtain a copy of the License at
     16 
     17        http://www.apache.org/licenses/LICENSE-2.0
     18 
     19    Unless required by applicable law or agreed to in writing, software
     20    distributed under the License is distributed on an "AS IS" BASIS,
     21    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     22    See the License for the specific language governing permissions and
     23    limitations under the License.
     24  -->
     25 
     26 <!--
     27 
     28  Sample stylesheet to be used with Ant JUnitReport output.
     29 
     30  It creates a set of HTML files a la javadoc where you can browse easily
     31  through all packages and classes.
     32 
     33 -->
     34 <xsl:param name="output.dir" select="'.'"/>
     35 
     36 
     37 <xsl:template match="testsuites">
     38     <!-- create the index.html -->
     39     <redirect:write file="{$output.dir}/index.html">
     40         <xsl:call-template name="index.html"/>
     41     </redirect:write>
     42 
     43     <!-- create the stylesheet.css -->
     44     <redirect:write file="{$output.dir}/stylesheet.css">
     45         <xsl:call-template name="stylesheet.css"/>
     46     </redirect:write>
     47 
     48     <!-- create the overview-packages.html at the root -->
     49     <redirect:write file="{$output.dir}/overview-summary.html">
     50         <xsl:apply-templates select="." mode="overview.packages"/>
     51     </redirect:write>
     52 
     53     <!-- create the all-packages.html at the root -->
     54     <redirect:write file="{$output.dir}/overview-frame.html">
     55         <xsl:apply-templates select="." mode="all.packages"/>
     56     </redirect:write>
     57 
     58     <!-- create the all-classes.html at the root -->
     59     <redirect:write file="{$output.dir}/allclasses-frame.html">
     60         <xsl:apply-templates select="." mode="all.classes"/>
     61     </redirect:write>
     62 
     63     <!-- process all packages -->
     64     <xsl:for-each select="./testsuite[not(./@package = preceding-sibling::testsuite/@package)]">
     65         <xsl:call-template name="package">
     66             <xsl:with-param name="name" select="@package"/>
     67         </xsl:call-template>
     68     </xsl:for-each>
     69 </xsl:template>
     70 
     71 
     72 <xsl:template name="package">
     73     <xsl:param name="name"/>
     74     <xsl:variable name="package.dir">
     75         <xsl:if test="not($name = '')"><xsl:value-of select="translate($name,'.','/')"/></xsl:if>
     76         <xsl:if test="$name = ''">.</xsl:if>
     77     </xsl:variable>
     78     <!--Processing package <xsl:value-of select="@name"/> in <xsl:value-of select="$output.dir"/> -->
     79     <!-- create a classes-list.html in the package directory -->
     80     <redirect:write file="{$output.dir}/{$package.dir}/package-frame.html">
     81         <xsl:call-template name="classes.list">
     82             <xsl:with-param name="name" select="$name"/>
     83         </xsl:call-template>
     84     </redirect:write>
     85 
     86     <!-- create a package-summary.html in the package directory -->
     87     <redirect:write file="{$output.dir}/{$package.dir}/package-summary.html">
     88         <xsl:call-template name="package.summary">
     89             <xsl:with-param name="name" select="$name"/>
     90         </xsl:call-template>
     91     </redirect:write>
     92 
     93     <!-- for each class, creates a @name.html -->
     94     <!-- @bug there will be a problem with inner classes having the same name, it will be overwritten -->
     95     <xsl:for-each select="/testsuites/testsuite[@package = $name]">
     96         <redirect:write file="{$output.dir}/{$package.dir}/{@name}.html">
     97             <xsl:apply-templates select="." mode="class.details"/>
     98         </redirect:write>
     99         <xsl:if test="string-length(./system-out)!=0">
    100             <redirect:write file="{$output.dir}/{$package.dir}/{@name}-out.txt">
    101                 <xsl:value-of select="./system-out" />
    102             </redirect:write>
    103         </xsl:if>
    104         <xsl:if test="string-length(./system-err)!=0">
    105             <redirect:write file="{$output.dir}/{$package.dir}/{@name}-err.txt">
    106                 <xsl:value-of select="./system-err" />
    107             </redirect:write>
    108         </xsl:if>
    109     </xsl:for-each>
    110 </xsl:template>
    111 
    112 <xsl:template name="index.html">
    113 <html>
    114     <head>
    115         <title>Unit Test Results.</title>
    116     </head>
    117     <frameset cols="20%,80%">
    118         <frameset rows="30%,70%">
    119             <frame src="overview-frame.html" name="packageListFrame"/>
    120             <frame src="allclasses-frame.html" name="classListFrame"/>
    121         </frameset>
    122         <frame src="overview-summary.html" name="classFrame"/>
    123         <noframes>
    124             <h2>Frame Alert</h2>
    125             <p>
    126                 This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
    127             </p>
    128         </noframes>
    129     </frameset>
    130 </html>
    131 </xsl:template>
    132 
    133 <!-- this is the stylesheet css to use for nearly everything -->
    134 <xsl:template name="stylesheet.css">
    135 body {
    136     font:normal 68% verdana,arial,helvetica;
    137     color:#000000;
    138 }
    139 table tr td, table tr th {
    140     font-size: 68%;
    141 }
    142 table.details tr th{
    143     font-weight: bold;
    144     text-align:left;
    145     background:#a6caf0;
    146 }
    147 table.details tr td{
    148     background:#eeeee0;
    149 }
    150 
    151 p {
    152     line-height:1.5em;
    153     margin-top:0.5em; margin-bottom:1.0em;
    154 }
    155 h1 {
    156     margin: 0px 0px 5px; font: 165% verdana,arial,helvetica
    157 }
    158 h2 {
    159     margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica
    160 }
    161 h3 {
    162     margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica
    163 }
    164 h4 {
    165     margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
    166 }
    167 h5 {
    168     margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
    169 }
    170 h6 {
    171     margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
    172 }
    173 .Error {
    174     font-weight:bold; color:red;
    175 }
    176 .Failure {
    177     font-weight:bold; color:purple;
    178 }
    179 .Properties {
    180   text-align:right;
    181 }
    182 </xsl:template>
    183 
    184 
    185 <!-- ======================================================================
    186     This page is created for every testsuite class.
    187     It prints a summary of the testsuite and detailed information about
    188     testcase methods.
    189      ====================================================================== -->
    190 <xsl:template match="testsuite" mode="class.details">
    191     <xsl:variable name="package.name" select="@package"/>
    192     <xsl:variable name="class.name"><xsl:if test="not($package.name = '')"><xsl:value-of select="$package.name"/>.</xsl:if><xsl:value-of select="@name"/></xsl:variable>
    193     <html>
    194         <head>
    195           <title>Unit Test Results: <xsl:value-of select="$class.name"/></title>
    196             <xsl:call-template name="create.stylesheet.link">
    197                 <xsl:with-param name="package.name" select="$package.name"/>
    198             </xsl:call-template>
    199        <script type="text/javascript" language="JavaScript">
    200         var TestCases = new Array();
    201         var cur;
    202         <xsl:apply-templates select="properties"/>
    203        </script>
    204        <script type="text/javascript" language="JavaScript"><![CDATA[
    205         function displayProperties (name) {
    206           var win = window.open('','JUnitSystemProperties','scrollbars=1,resizable=1');
    207           var doc = win.document;
    208           doc.open();
    209           doc.write("<html><head><title>Properties of " + name + "</title>");
    210           doc.write("<style type=\"text/css\">");
    211           doc.write("body {font:normal 68% verdana,arial,helvetica; color:#000000; }");
    212           doc.write("table tr td, table tr th { font-size: 68%; }");
    213           doc.write("table.properties { border-collapse:collapse; border-left:solid 1 #cccccc; border-top:solid 1 #cccccc; padding:5px; }");
    214           doc.write("table.properties th { text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#eeeeee; }");
    215           doc.write("table.properties td { font:normal; text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#fffffff; }");
    216           doc.write("h3 { margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica }");
    217           doc.write("</style>");
    218           doc.write("</head><body>");
    219           doc.write("<h3>Properties of " + name + "</h3>");
    220           doc.write("<div align=\"right\"><a href=\"javascript:window.close();\">Close</a></div>");
    221           doc.write("<table class='properties'>");
    222           doc.write("<tr><th>Name</th><th>Value</th></tr>");
    223           for (prop in TestCases[name]) {
    224             doc.write("<tr><th>" + prop + "</th><td>" + TestCases[name][prop] + "</td></tr>");
    225           }
    226           doc.write("</table>");
    227           doc.write("</body></html>");
    228           doc.close();
    229           win.focus();
    230         }
    231       ]]>
    232       </script>
    233         </head>
    234         <body>
    235             <xsl:call-template name="pageHeader"/>
    236             <h3>Class <xsl:value-of select="$class.name"/></h3>
    237 
    238 
    239             <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
    240                 <xsl:call-template name="testsuite.test.header"/>
    241                 <xsl:apply-templates select="." mode="print.test"/>
    242             </table>
    243 
    244             <h2>Tests</h2>
    245             <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
    246         <xsl:call-template name="testcase.test.header"/>
    247               <!--
    248               test can even not be started at all (failure to load the class)
    249               so report the error directly
    250               -->
    251                 <xsl:if test="./error">
    252                     <tr class="Error">
    253                         <td colspan="4"><xsl:apply-templates select="./error"/></td>
    254                     </tr>
    255                 </xsl:if>
    256                 <xsl:apply-templates select="./testcase" mode="print.test"/>
    257             </table>
    258             <div class="Properties">
    259                 <a>
    260                     <xsl:attribute name="href">javascript:displayProperties('<xsl:value-of select="@package"/>.<xsl:value-of select="@name"/>');</xsl:attribute>
    261                     Properties &#187;
    262                 </a>
    263             </div>
    264             <xsl:if test="string-length(./system-out)!=0">
    265                 <div class="Properties">
    266                     <a>
    267                         <xsl:attribute name="href">./<xsl:value-of select="@name"/>-out.txt</xsl:attribute>
    268                         System.out &#187;
    269                     </a>
    270                 </div>
    271             </xsl:if>
    272             <xsl:if test="string-length(./system-err)!=0">
    273                 <div class="Properties">
    274                     <a>
    275                         <xsl:attribute name="href">./<xsl:value-of select="@name"/>-err.txt</xsl:attribute>
    276                         System.err &#187;
    277                     </a>
    278                 </div>
    279             </xsl:if>
    280         </body>
    281     </html>
    282 </xsl:template>
    283 
    284   <!--
    285    Write properties into a JavaScript data structure.
    286    This is based on the original idea by Erik Hatcher (ehatcher (a] apache.org)
    287    -->
    288   <xsl:template match="properties">
    289     cur = TestCases['<xsl:value-of select="../@package"/>.<xsl:value-of select="../@name"/>'] = new Array();
    290     <xsl:for-each select="property">
    291     <xsl:sort select="@name"/>
    292         cur['<xsl:value-of select="@name"/>'] = '<xsl:call-template name="JS-escape"><xsl:with-param name="string" select="@value"/></xsl:call-template>';
    293     </xsl:for-each>
    294   </xsl:template>
    295 
    296 
    297 <!-- ======================================================================
    298     This page is created for every package.
    299     It prints the name of all classes that belongs to this package.
    300     @param name the package name to print classes.
    301      ====================================================================== -->
    302 <!-- list of classes in a package -->
    303 <xsl:template name="classes.list">
    304     <xsl:param name="name"/>
    305     <html>
    306         <head>
    307             <title>Unit Test Classes: <xsl:value-of select="$name"/></title>
    308             <xsl:call-template name="create.stylesheet.link">
    309                 <xsl:with-param name="package.name" select="$name"/>
    310             </xsl:call-template>
    311         </head>
    312         <body>
    313             <table width="100%">
    314                 <tr>
    315                     <td nowrap="nowrap">
    316                         <h2><a href="package-summary.html" target="classFrame">
    317                             <xsl:value-of select="$name"/>
    318                             <xsl:if test="$name = ''">&lt;none&gt;</xsl:if>
    319                         </a></h2>
    320                     </td>
    321                 </tr>
    322             </table>
    323 
    324             <h2>Classes</h2>
    325             <table width="100%">
    326                 <xsl:for-each select="/testsuites/testsuite[./@package = $name]">
    327                     <xsl:sort select="@name"/>
    328                     <tr>
    329                         <td nowrap="nowrap">
    330                             <a href="{@name}.html" target="classFrame"><xsl:value-of select="@name"/></a>
    331                         </td>
    332                     </tr>
    333                 </xsl:for-each>
    334             </table>
    335         </body>
    336     </html>
    337 </xsl:template>
    338 
    339 
    340 <!--
    341     Creates an all-classes.html file that contains a link to all package-summary.html
    342     on each class.
    343 -->
    344 <xsl:template match="testsuites" mode="all.classes">
    345     <html>
    346         <head>
    347             <title>All Unit Test Classes</title>
    348             <xsl:call-template name="create.stylesheet.link">
    349                 <xsl:with-param name="package.name"/>
    350             </xsl:call-template>
    351         </head>
    352         <body>
    353             <h2>Classes</h2>
    354             <table width="100%">
    355                 <xsl:apply-templates select="testsuite" mode="all.classes">
    356                     <xsl:sort select="@name"/>
    357                 </xsl:apply-templates>
    358             </table>
    359         </body>
    360     </html>
    361 </xsl:template>
    362 
    363 <xsl:template match="testsuite" mode="all.classes">
    364     <xsl:variable name="package.name" select="@package"/>
    365     <tr>
    366         <td nowrap="nowrap">
    367             <a target="classFrame">
    368                 <xsl:attribute name="href">
    369                     <xsl:if test="not($package.name='')">
    370                         <xsl:value-of select="translate($package.name,'.','/')"/><xsl:text>/</xsl:text>
    371                     </xsl:if><xsl:value-of select="@name"/><xsl:text>.html</xsl:text>
    372                 </xsl:attribute>
    373                 <xsl:value-of select="@name"/>
    374             </a>
    375         </td>
    376     </tr>
    377 </xsl:template>
    378 
    379 
    380 <!--
    381     Creates an html file that contains a link to all package-summary.html files on
    382     each package existing on testsuites.
    383     @bug there will be a problem here, I don't know yet how to handle unnamed package :(
    384 -->
    385 <xsl:template match="testsuites" mode="all.packages">
    386     <html>
    387         <head>
    388             <title>All Unit Test Packages</title>
    389             <xsl:call-template name="create.stylesheet.link">
    390                 <xsl:with-param name="package.name"/>
    391             </xsl:call-template>
    392         </head>
    393         <body>
    394             <h2><a href="overview-summary.html" target="classFrame">Home</a></h2>
    395             <h2>Packages</h2>
    396             <table width="100%">
    397                 <xsl:apply-templates select="testsuite[not(./@package = preceding-sibling::testsuite/@package)]" mode="all.packages">
    398                     <xsl:sort select="@package"/>
    399                 </xsl:apply-templates>
    400             </table>
    401         </body>
    402     </html>
    403 </xsl:template>
    404 
    405 <xsl:template match="testsuite" mode="all.packages">
    406     <tr>
    407         <td nowrap="nowrap">
    408             <a href="./{translate(@package,'.','/')}/package-summary.html" target="classFrame">
    409                 <xsl:value-of select="@package"/>
    410                 <xsl:if test="@package = ''">&lt;none&gt;</xsl:if>
    411             </a>
    412         </td>
    413     </tr>
    414 </xsl:template>
    415 
    416 
    417 <xsl:template match="testsuites" mode="overview.packages">
    418     <html>
    419         <head>
    420             <title>Unit Test Results: Summary</title>
    421             <xsl:call-template name="create.stylesheet.link">
    422                 <xsl:with-param name="package.name"/>
    423             </xsl:call-template>
    424         </head>
    425         <body>
    426         <xsl:attribute name="onload">open('allclasses-frame.html','classListFrame')</xsl:attribute>
    427         <xsl:call-template name="pageHeader"/>
    428         <h2>Summary</h2>
    429         <xsl:variable name="testCount" select="sum(testsuite/@tests)"/>
    430         <xsl:variable name="errorCount" select="sum(testsuite/@errors)"/>
    431         <xsl:variable name="failureCount" select="sum(testsuite/@failures)"/>
    432         <xsl:variable name="timeCount" select="sum(testsuite/@time)"/>
    433         <xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/>
    434         <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
    435         <tr valign="top">
    436             <th>Tests</th>
    437             <th>Failures</th>
    438             <th>Errors</th>
    439             <th>Success rate</th>
    440             <th>Time</th>
    441         </tr>
    442         <tr valign="top">
    443             <xsl:attribute name="class">
    444                 <xsl:choose>
    445                     <xsl:when test="$errorCount &gt; 0">Error</xsl:when>
    446                     <xsl:when test="$failureCount &gt; 0">Failure</xsl:when>
    447                     <xsl:otherwise>Pass</xsl:otherwise>
    448                 </xsl:choose>
    449             </xsl:attribute>
    450             <td><xsl:value-of select="$testCount"/></td>
    451             <td><xsl:value-of select="$failureCount"/></td>
    452             <td><xsl:value-of select="$errorCount"/></td>
    453             <td>
    454                 <xsl:call-template name="display-percent">
    455                     <xsl:with-param name="value" select="$successRate"/>
    456                 </xsl:call-template>
    457             </td>
    458             <td>
    459                 <xsl:call-template name="display-time">
    460                     <xsl:with-param name="value" select="$timeCount"/>
    461                 </xsl:call-template>
    462             </td>
    463         </tr>
    464         </table>
    465         <table border="0" width="95%">
    466         <tr>
    467         <td style="text-align: justify;">
    468         Note: <em>failures</em> are anticipated and checked for with assertions while <em>errors</em> are unanticipated.
    469         </td>
    470         </tr>
    471         </table>
    472 
    473         <h2>Packages</h2>
    474         <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
    475             <xsl:call-template name="testsuite.test.header"/>
    476             <xsl:for-each select="testsuite[not(./@package = preceding-sibling::testsuite/@package)]">
    477                 <xsl:sort select="@package" order="ascending"/>
    478                 <!-- get the node set containing all testsuites that have the same package -->
    479                 <xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = current()/@package]"/>
    480                 <tr valign="top">
    481                     <!-- display a failure if there is any failure/error in the package -->
    482                     <xsl:attribute name="class">
    483                         <xsl:choose>
    484                             <xsl:when test="sum($insamepackage/@errors) &gt; 0">Error</xsl:when>
    485                             <xsl:when test="sum($insamepackage/@failures) &gt; 0">Failure</xsl:when>
    486                             <xsl:otherwise>Pass</xsl:otherwise>
    487                         </xsl:choose>
    488                     </xsl:attribute>
    489                     <td><a href="./{translate(@package,'.','/')}/package-summary.html">
    490                         <xsl:value-of select="@package"/>
    491                         <xsl:if test="@package = ''">&lt;none&gt;</xsl:if>
    492                     </a></td>
    493                     <td><xsl:value-of select="sum($insamepackage/@tests)"/></td>
    494                     <td><xsl:value-of select="sum($insamepackage/@errors)"/></td>
    495                     <td><xsl:value-of select="sum($insamepackage/@failures)"/></td>
    496                     <td>
    497                     <xsl:call-template name="display-time">
    498                         <xsl:with-param name="value" select="sum($insamepackage/@time)"/>
    499                     </xsl:call-template>
    500                     </td>
    501                     <td><xsl:value-of select="$insamepackage/@timestamp"/></td>
    502                     <td><xsl:value-of select="$insamepackage/@hostname"/></td>
    503                 </tr>
    504             </xsl:for-each>
    505         </table>
    506         </body>
    507         </html>
    508 </xsl:template>
    509 
    510 
    511 <xsl:template name="package.summary">
    512     <xsl:param name="name"/>
    513     <html>
    514         <head>
    515             <xsl:call-template name="create.stylesheet.link">
    516                 <xsl:with-param name="package.name" select="$name"/>
    517             </xsl:call-template>
    518         </head>
    519         <body>
    520             <xsl:attribute name="onload">open('package-frame.html','classListFrame')</xsl:attribute>
    521             <xsl:call-template name="pageHeader"/>
    522             <h3>Package <xsl:value-of select="$name"/></h3>
    523 
    524             <!--table border="0" cellpadding="5" cellspacing="2" width="95%">
    525                 <xsl:call-template name="class.metrics.header"/>
    526                 <xsl:apply-templates select="." mode="print.metrics"/>
    527             </table-->
    528 
    529             <xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = $name]"/>
    530             <xsl:if test="count($insamepackage) &gt; 0">
    531                 <h2>Classes</h2>
    532                 <p>
    533                 <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
    534                     <xsl:call-template name="testsuite.test.header"/>
    535                     <xsl:apply-templates select="$insamepackage" mode="print.test">
    536                         <xsl:sort select="@name"/>
    537                     </xsl:apply-templates>
    538                 </table>
    539                 </p>
    540             </xsl:if>
    541         </body>
    542     </html>
    543 </xsl:template>
    544 
    545 
    546 <!--
    547     transform string like a.b.c to ../../../
    548     @param path the path to transform into a descending directory path
    549 -->
    550 <xsl:template name="path">
    551     <xsl:param name="path"/>
    552     <xsl:if test="contains($path,'.')">
    553         <xsl:text>../</xsl:text>
    554         <xsl:call-template name="path">
    555             <xsl:with-param name="path"><xsl:value-of select="substring-after($path,'.')"/></xsl:with-param>
    556         </xsl:call-template>
    557     </xsl:if>
    558     <xsl:if test="not(contains($path,'.')) and not($path = '')">
    559         <xsl:text>../</xsl:text>
    560     </xsl:if>
    561 </xsl:template>
    562 
    563 
    564 <!-- create the link to the stylesheet based on the package name -->
    565 <xsl:template name="create.stylesheet.link">
    566     <xsl:param name="package.name"/>
    567     <link rel="stylesheet" type="text/css" title="Style"><xsl:attribute name="href"><xsl:if test="not($package.name = 'unnamed package')"><xsl:call-template name="path"><xsl:with-param name="path" select="$package.name"/></xsl:call-template></xsl:if>stylesheet.css</xsl:attribute></link>
    568 </xsl:template>
    569 
    570 
    571 <!-- Page HEADER -->
    572 <xsl:template name="pageHeader">
    573     <h1>Unit Test Results</h1>
    574     <table width="100%">
    575     <tr>
    576         <td align="left"></td>
    577         <td align="right">Designed for use with <a href="http://www.junit.org/">JUnit</a> and <a href="http://ant.apache.org/">Ant</a>.</td>
    578     </tr>
    579     </table>
    580     <hr size="1"/>
    581 </xsl:template>
    582 
    583 <!-- class header -->
    584 <xsl:template name="testsuite.test.header">
    585     <tr valign="top">
    586         <th width="80%">Name</th>
    587         <th>Tests</th>
    588         <th>Errors</th>
    589         <th>Failures</th>
    590         <th nowrap="nowrap">Time(s)</th>
    591         <th nowrap="nowrap">Time Stamp</th>
    592         <th>Host</th>
    593     </tr>
    594 </xsl:template>
    595 
    596 <!-- method header -->
    597 <xsl:template name="testcase.test.header">
    598     <tr valign="top">
    599         <th>Name</th>
    600         <th>Status</th>
    601         <th width="80%">Type</th>
    602         <th nowrap="nowrap">Time(s)</th>
    603     </tr>
    604 </xsl:template>
    605 
    606 
    607 <!-- class information -->
    608 <xsl:template match="testsuite" mode="print.test">
    609     <tr valign="top">
    610         <xsl:attribute name="class">
    611             <xsl:choose>
    612                 <xsl:when test="@errors[.&gt; 0]">Error</xsl:when>
    613                 <xsl:when test="@failures[.&gt; 0]">Failure</xsl:when>
    614                 <xsl:otherwise>Pass</xsl:otherwise>
    615             </xsl:choose>
    616         </xsl:attribute>
    617         <td><a href="{@name}.html"><xsl:value-of select="@name"/></a></td>
    618         <td><xsl:apply-templates select="@tests"/></td>
    619         <td><xsl:apply-templates select="@errors"/></td>
    620         <td><xsl:apply-templates select="@failures"/></td>
    621         <td><xsl:call-template name="display-time">
    622                 <xsl:with-param name="value" select="@time"/>
    623             </xsl:call-template>
    624         </td>
    625         <td><xsl:apply-templates select="@timestamp"/></td>
    626         <td><xsl:apply-templates select="@hostname"/></td>
    627     </tr>
    628 </xsl:template>
    629 
    630 <xsl:template match="testcase" mode="print.test">
    631     <tr valign="top">
    632         <xsl:attribute name="class">
    633             <xsl:choose>
    634                 <xsl:when test="error">Error</xsl:when>
    635                 <xsl:when test="failure">Failure</xsl:when>
    636                 <xsl:otherwise>TableRowColor</xsl:otherwise>
    637             </xsl:choose>
    638         </xsl:attribute>
    639         <td><xsl:value-of select="@name"/></td>
    640         <xsl:choose>
    641             <xsl:when test="failure">
    642                 <td>Failure</td>
    643                 <td><xsl:apply-templates select="failure"/></td>
    644             </xsl:when>
    645             <xsl:when test="error">
    646                 <td>Error</td>
    647                 <td><xsl:apply-templates select="error"/></td>
    648             </xsl:when>
    649             <xsl:otherwise>
    650                 <td>Success</td>
    651                 <td></td>
    652             </xsl:otherwise>
    653         </xsl:choose>
    654         <td>
    655             <xsl:call-template name="display-time">
    656                 <xsl:with-param name="value" select="@time"/>
    657             </xsl:call-template>
    658         </td>
    659     </tr>
    660 </xsl:template>
    661 
    662 
    663 <!-- Note : the below template error and failure are the same style
    664             so just call the same style store in the toolkit template -->
    665 <xsl:template match="failure">
    666     <xsl:call-template name="display-failures"/>
    667 </xsl:template>
    668 
    669 <xsl:template match="error">
    670     <xsl:call-template name="display-failures"/>
    671 </xsl:template>
    672 
    673 <!-- Style for the error and failure in the testcase template -->
    674 <xsl:template name="display-failures">
    675     <xsl:choose>
    676         <xsl:when test="not(@message)">N/A</xsl:when>
    677         <xsl:otherwise>
    678             <xsl:value-of select="@message"/>
    679         </xsl:otherwise>
    680     </xsl:choose>
    681     <!-- display the stacktrace -->
    682     <br/><br/>
    683     <code>
    684         <xsl:call-template name="br-replace">
    685             <xsl:with-param name="word" select="."/>
    686         </xsl:call-template>
    687     </code>
    688     <!-- the latter is better but might be problematic for non-21" monitors... -->
    689     <!--pre><xsl:value-of select="."/></pre-->
    690 </xsl:template>
    691 
    692 <xsl:template name="JS-escape">
    693     <xsl:param name="string"/>
    694     <xsl:param name="tmp1" select="stringutils:replace(string($string),'\','\\')"/>
    695     <xsl:param name="tmp2" select="stringutils:replace(string($tmp1),&quot;'&quot;,&quot;\&apos;&quot;)"/>
    696     <xsl:value-of select="$tmp2"/>
    697 </xsl:template>
    698 
    699 
    700 <!--
    701     template that will convert a carriage return into a br tag
    702     @param word the text from which to convert CR to BR tag
    703 -->
    704 <xsl:template name="br-replace">
    705     <xsl:param name="word"/>
    706     <xsl:param name="br"><br/></xsl:param>
    707     <xsl:value-of select='stringutils:replace(string($word),"&#xA;",$br)'/>
    708 </xsl:template>
    709 
    710 <xsl:template name="display-time">
    711     <xsl:param name="value"/>
    712     <xsl:value-of select="format-number($value,'0.000')"/>
    713 </xsl:template>
    714 
    715 <xsl:template name="display-percent">
    716     <xsl:param name="value"/>
    717     <xsl:value-of select="format-number($value,'0.00%')"/>
    718 </xsl:template>
    719 </xsl:stylesheet>
    720