2 - Copyright (c) 2017 Vojtech Horky
5 - Redistribution and use in source and binary forms, with or without
6 - modification, are permitted provided that the following conditions
9 - - Redistributions of source code must retain the above copyright
10 - notice, this list of conditions and the following disclaimer.
11 - - Redistributions in binary form must reproduce the above copyright
12 - notice, this list of conditions and the following disclaimer in the
13 - documentation and/or other materials provided with the distribution.
14 - - The name of the author may not be used to endorse or promote products
15 - derived from this software without specific prior written permission.
17 - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 <xsl:stylesheet version=
"1.0"
29 xmlns:
xsl=
"http://www.w3.org/1999/XSL/Transform"
30 xmlns=
"http://www.w3.org/1999/xhtml">
32 <xsl:import href=
"common.xsl" />
37 omit-xml-declaration=
"yes"
38 doctype-system=
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
39 doctype-public=
"-//W3C//DTD XHTML 1.0 Transitional//EN"
42 <xsl:key name=
"by-arch" match=
"/build/*" use=
"@arch" />
43 <xsl:key name=
"by-harbour" match=
"/build/*" use=
"@package" />
44 <xsl:key name=
"by-scenario" match=
"/build/*" use=
"@scenario" />
46 <xsl:variable name=
"LINK_TO_TOP">
47 <span class=
"back-to-top"><a href=
"#top-of-page">(back to top)
</a></span>
51 <xsl:template match=
"build">
52 <xsl:variable name=
"BUILD" select=
"." />
53 <xsl:call-template name=
"HTML_PAGE">
54 <xsl:with-param name=
"TITLE">
55 <xsl:text>HelenOS CI (build
</xsl:text>
56 <xsl:value-of select=
"@number" />
57 <xsl:text>)
</xsl:text>
59 <xsl:with-param name=
"EXTRA_HEAD">
60 <script type=
"text/javascript" language=
"JavaScript">
61 $( document ).ready(function() {
64 function showHideLog(link, target) {
65 target = $(link).parents(
"table").find(
"." + target)
66 if (target.is(
":hidden")) {
77 <xsl:with-param name=
"BODY">
80 <h1 id=
"top-of-page">HelenOS continuous integration testing
</h1>
82 Build
<xsl:value-of select=
"@number" /> from
<xsl:value-of select=
"buildinfo/@started" />
83 (
<xsl:apply-templates select=
"buildinfo" mode=
"duration" />)
86 <h2>Summary results
</h2>
87 <xsl:apply-templates select=
"." mode=
"html-summary-table" />
90 <div id=
"quick-links" class=
"buttonset">
93 <div class=
"quick-link-group">
94 <h3>Miscellaneous
</h3>
96 <li><a href=
"#matrix">Summary matrix
</a></li>
97 <li><a href=
"#failures">List of failed tasks
</a></li>
98 <xsl:if test=
"helenos-build">
99 <li><a href=
"#helenos">HelenOS
</a></li>
104 <xsl:if test=
"count(*[@arch]) > 0">
105 <div class=
"quick-link-group">
106 <h3>Architectures
</h3>
108 <xsl:for-each select=
"*[@arch and count(. | key('by-arch', @arch)[parent::build = $BUILD][1]) = 1]">
109 <xsl:sort select=
"@arch" />
110 <xsl:variable name=
"ARCH" select=
"@arch" />
111 <li><a href=
"#arch-{$ARCH}"><xsl:value-of select=
"$ARCH" /></a></li>
117 <xsl:if test=
"count(*[@package]) > 0">
118 <div class=
"quick-link-group">
121 <xsl:for-each select=
"*[@package and count(. | key('by-harbour', @package)[parent::build = $BUILD][1]) = 1]">
122 <xsl:sort select=
"@package" />
123 <xsl:variable name=
"PKG" select=
"@package" />
124 <li><a href=
"#harbour-{$PKG}"><xsl:value-of select=
"$PKG" /></a></li>
130 <xsl:if test=
"count(*[@scenario]) > 0">
131 <div class=
"quick-link-group">
132 <h3>Testing scenarios
</h3>
134 <xsl:for-each select=
"*[@scenario and count(. | key('by-scenario', @scenario)[parent::build = $BUILD][1]) = 1]">
135 <xsl:sort select=
"@scenario" />
136 <xsl:variable name=
"SCENARIO" select=
"@scenario" />
137 <li><a href=
"#scenario-{$SCENARIO}"><xsl:value-of select=
"$SCENARIO" /></a></li>
145 <h2 id=
"matrix">Summary matrix
<xsl:copy-of select=
"$LINK_TO_TOP" /></h2>
146 <table class=
"matrix">
150 <xsl:for-each select=
"*[@arch and count(. | key('by-arch', @arch)[parent::build = $BUILD][1]) = 1]">
151 <xsl:sort select=
"@arch" />
153 <xsl:apply-templates select=
"@arch" mode=
"architecture-with-hyphens" />
161 <xsl:for-each select=
"*[@arch and count(. | key('by-arch', @arch)[parent::build = $BUILD][1]) = 1]">
162 <xsl:sort select=
"@arch" />
163 <xsl:variable name=
"ARCH" select=
"@arch" />
164 <xsl:variable name=
"RESULT" select=
"//helenos-build[@arch=$ARCH]" />
165 <td class=
"result-{$RESULT/@result}"><xsl:apply-templates select=
"$RESULT" mode=
"log-link-matrix" /></td>
168 <xsl:for-each select=
"*[@package and count(. | key('by-harbour', @package)[parent::build = $BUILD][1]) = 1]">
169 <xsl:sort select=
"@package" />
170 <xsl:variable name=
"PKG" select=
"@package" />
172 <th><xsl:value-of select=
"$PKG" /></th>
173 <xsl:for-each select=
"//*[@arch and count(. | key('by-arch', @arch)[parent::build = $BUILD][1]) = 1]">
174 <xsl:sort select=
"@arch" />
175 <xsl:variable name=
"ARCH" select=
"@arch" />
176 <xsl:variable name=
"RESULT" select=
"//harbour-build[@arch=$ARCH and @package=$PKG]" />
178 <xsl:when test=
"$RESULT">
179 <td class=
"result-{$RESULT/@result}"><xsl:apply-templates select=
"$RESULT" mode=
"log-link-matrix" /></td>
182 <td class=
"result-na">N/A
</td>
191 <h2>Miscellaneous
</h2>
192 <h3 id=
"failures">List of failed tasks
<xsl:copy-of select=
"$LINK_TO_TOP" /></h3>
194 <xsl:when test=
"count(*[@result='fail']) = 0">
195 <p>There were no failures.
</p>
201 <th width=
"25%">Task
</th>
202 <th width=
"25%">Component
</th>
203 <th width=
"20%">Architecture
</th>
204 <th width=
"20%">Log
</th>
205 <th width=
"10%">Duration
</th>
209 <xsl:for-each select=
"checkout[@result='fail']">
210 <xsl:sort select=
"@repository" />
211 <xsl:apply-templates select=
"." mode=
"html-failed-task-table-row" />
213 <xsl:apply-templates select=
"harbour-check[@result='fail']" mode=
"html-failed-task-table-row" />
214 <xsl:for-each select=
"helenos-build[@result='fail']">
215 <xsl:sort select=
"@arch" />
216 <xsl:apply-templates select=
"." mode=
"html-failed-task-table-row" />
218 <xsl:for-each select=
"harbour-fetch[@result='fail']">
219 <xsl:sort select=
"@package" />
220 <xsl:apply-templates select=
"." mode=
"html-failed-task-table-row" />
222 <xsl:for-each select=
"harbour-build[@result='fail']">
223 <xsl:sort select=
"@package" />
224 <xsl:sort select=
"@arch" />
225 <xsl:apply-templates select=
"." mode=
"html-failed-task-table-row" />
227 <xsl:for-each select=
"helenos-extra-build[@result='fail']">
228 <xsl:sort select=
"@arch" />
229 <xsl:sort select=
"@packages" />
230 <xsl:apply-templates select=
"." mode=
"html-failed-task-table-row" />
232 <xsl:for-each select=
"test[@result='fail']">
233 <xsl:sort select=
"@scenario" />
234 <xsl:sort select=
"@arch" />
235 <xsl:apply-templates select=
"." mode=
"html-failed-task-table-row" />
237 <!-- xsl:apply-templates select="*[@result='fail']" mode="html-failed-task-table-row" /-->
243 <xsl:if test=
"helenos-build">
244 <h3 id=
"helenos">HelenOS
<xsl:copy-of select=
"$LINK_TO_TOP" /></h3>
248 <th width=
"25%">Architecture
</th>
249 <th width=
"10%">Result
</th>
250 <th width=
"35%">Download
</th>
251 <th width=
"20%">Log
</th>
252 <th width=
"10%">Duration
</th>
256 <xsl:for-each select=
"helenos-build">
257 <xsl:sort select=
"@arch" />
258 <tr class=
"result-{@result}">
260 <xsl:value-of select=
"@arch" />
263 <xsl:apply-templates select=
"." mode=
"yes-no" />
266 <xsl:apply-templates select=
"." mode=
"download" />
269 <xsl:apply-templates select=
"." mode=
"log-link" />
272 <xsl:apply-templates select=
"." mode=
"duration" />
275 <xsl:apply-templates select=
"." mode=
"log-dump" />
282 <xsl:if test=
"count(*[@arch]) > 0">
283 <h2>Per-architecture details
<xsl:copy-of select=
"$LINK_TO_TOP" /></h2>
284 <xsl:for-each select=
"$BUILD/*[@arch and count(. | key('by-arch', @arch)[parent::build = $BUILD][1]) = 1]">
285 <xsl:sort select=
"@arch" />
286 <xsl:variable name=
"ARCH" select=
"@arch" />
287 <h3 id=
"arch-{$ARCH}"><xsl:value-of select=
"$ARCH" /><xsl:copy-of select=
"$LINK_TO_TOP" /></h3>
291 <th width=
"25%">Task
</th>
292 <th width=
"10%">Result
</th>
293 <th width=
"35%">Download
</th>
294 <th width=
"20%">Log
</th>
295 <th width=
"10%">Duration
</th>
299 <tr class=
"result-{$BUILD/helenos-build[@arch=$ARCH]/@result}">
302 <xsl:apply-templates select=
"$BUILD/helenos-build[@arch=$ARCH]" mode=
"yes-no" />
305 <xsl:apply-templates select=
"." mode=
"download" />
308 <xsl:apply-templates select=
"$BUILD/helenos-build[@arch=$ARCH]" mode=
"log-link" />
311 <xsl:apply-templates select=
"." mode=
"duration" />
314 <xsl:apply-templates select=
"$BUILD/helenos-build[@arch=$ARCH]" mode=
"log-dump" />
315 <xsl:for-each select=
"$BUILD/harbour-build[@arch=$ARCH]">
316 <tr class=
"result-{@result}">
317 <td><xsl:value-of select=
"@package" /></td>
319 <xsl:apply-templates select=
"." mode=
"yes-no" />
322 <xsl:apply-templates select=
"." mode=
"download" />
325 <xsl:apply-templates select=
"." mode=
"log-link" />
328 <xsl:apply-templates select=
"." mode=
"duration" />
331 <xsl:apply-templates select=
"." mode=
"log-dump" />
333 <xsl:for-each select=
"$BUILD/helenos-extra-build[@arch=$ARCH]">
334 <tr class=
"result-{@result}">
335 <td>HelenOS with
<xsl:value-of select=
"@harbours" /></td>
337 <xsl:apply-templates select=
"." mode=
"yes-no" />
340 <xsl:apply-templates select=
"." mode=
"download" />
343 <xsl:apply-templates select=
"." mode=
"log-link" />
346 <xsl:apply-templates select=
"." mode=
"duration" />
349 <xsl:apply-templates select=
"." mode=
"log-dump" />
351 <xsl:for-each select=
"$BUILD/test[@arch=$ARCH]">
352 <tr class=
"result-{@result}">
353 <td><xsl:value-of select=
"@scenario" /></td>
355 <xsl:apply-templates select=
"." mode=
"yes-no" />
358 <xsl:apply-templates select=
"." mode=
"download" />
361 <xsl:apply-templates select=
"." mode=
"log-link" />
364 <xsl:apply-templates select=
"." mode=
"duration" />
367 <xsl:apply-templates select=
"." mode=
"log-dump" />
374 <xsl:if test=
"count(*[@package]) > 0">
375 <h2>Per-harbour details
<xsl:copy-of select=
"$LINK_TO_TOP" /></h2>
376 <xsl:for-each select=
"$BUILD/*[@package and count(. | key('by-harbour', @package)[parent::build = $BUILD][1]) = 1]">
377 <xsl:sort select=
"@package" />
378 <xsl:variable name=
"PKG" select=
"@package" />
379 <h3 id=
"harbour-{$PKG}"><xsl:value-of select=
"$PKG" /><xsl:copy-of select=
"$LINK_TO_TOP" /></h3>
383 <th width=
"25%">Architecture
</th>
384 <th width=
"10%">Result
</th>
385 <th width=
"35%">Download
</th>
386 <th width=
"20%">Log
</th>
387 <th width=
"10%">Duration
</th>
391 <tr class=
"result-{$BUILD/harbour-fetch[@package=$PKG]/@result}">
392 <td><i>Tarball fetch
</i></td>
394 <xsl:apply-templates select=
"$BUILD/harbour-fetch[@package=$PKG]" mode=
"yes-no" />
397 <xsl:apply-templates select=
"." mode=
"download" />
400 <xsl:apply-templates select=
"$BUILD/harbour-fetch[@package=$PKG]" mode=
"log-link" />
403 <xsl:apply-templates select=
"." mode=
"duration" />
406 <xsl:apply-templates select=
"$BUILD/harbour-fetch[@package=$PKG]" mode=
"log-dump" />
407 <xsl:for-each select=
"$BUILD/harbour-build[@package=$PKG]">
408 <xsl:sort select=
"@arch" />
409 <tr class=
"result-{@result}">
410 <td><xsl:value-of select=
"@arch" /></td>
412 <xsl:apply-templates select=
"." mode=
"yes-no" />
415 <xsl:apply-templates select=
"." mode=
"download" />
418 <xsl:apply-templates select=
"." mode=
"log-link" />
421 <xsl:apply-templates select=
"." mode=
"duration" />
424 <xsl:apply-templates select=
"." mode=
"log-dump" />
431 <xsl:if test=
"count(*[@scenario]) > 0">
432 <h2>Per-scenario details
<xsl:copy-of select=
"$LINK_TO_TOP" /></h2>
433 <xsl:for-each select=
"$BUILD/*[@scenario and count(. | key('by-scenario', @scenario)[parent::build = $BUILD][1]) = 1]">
434 <xsl:sort select=
"@scenario" />
435 <xsl:variable name=
"SCENARIO" select=
"@scenario" />
436 <h3 id=
"scenario-{$SCENARIO}"><xsl:value-of select=
"$SCENARIO" /><xsl:copy-of select=
"$LINK_TO_TOP" /></h3>
440 <th width=
"25%">Architecture
</th>
441 <th width=
"10%">Result
</th>
442 <th width=
"35%">Download
</th>
443 <th width=
"20%">Log
</th>
444 <th width=
"10%">Duration
</th>
448 <xsl:for-each select=
"$BUILD/test[@scenario=$SCENARIO]">
449 <xsl:sort select=
"@arch" />
450 <tr class=
"result-{@result}">
451 <td><xsl:value-of select=
"@arch" /></td>
453 <xsl:apply-templates select=
"." mode=
"yes-no" />
456 <xsl:apply-templates select=
"." mode=
"download" />
459 <xsl:apply-templates select=
"." mode=
"log-link" />
462 <xsl:apply-templates select=
"." mode=
"duration" />
465 <xsl:apply-templates select=
"." mode=
"log-dump" />
478 <xsl:template match=
"@*" mode=
"architecture-with-hyphens">
479 <xsl:variable name=
"PLATFORM" select=
"substring-before(., '/')" />
480 <xsl:variable name=
"MACHINE" select=
"substring-after(., '/')" />
482 <xsl:when test=
"concat($PLATFORM, $MACHINE) = ''">
483 <xsl:value-of select=
"." />
486 <xsl:value-of select=
"$PLATFORM" />
487 <xsl:text> </xsl:text>
489 <xsl:when test=
"$MACHINE = 'beagleboardxm'">
490 <xsl:text disable-output-escaping=
"yes"><![CDATA[beagle
­board
­xm]]
></xsl:text>
492 <xsl:when test=
"$MACHINE = 'beaglebone'">
493 <xsl:text disable-output-escaping=
"yes"><![CDATA[beagle
­bone]]
></xsl:text>
495 <xsl:when test=
"$MACHINE = 'malta-be'">
496 <xsl:text disable-output-escaping=
"yes"><![CDATA[malta
­-be]]
></xsl:text>
498 <xsl:when test=
"$MACHINE = 'malta-le'">
499 <xsl:text disable-output-escaping=
"yes"><![CDATA[malta
­-le]]
></xsl:text>
501 <xsl:when test=
"$MACHINE = 'integratorcp'">
502 <xsl:text disable-output-escaping=
"yes"><![CDATA[inte
­gra
­torcp]]
></xsl:text>
504 <xsl:when test=
"$MACHINE = 'raspberrypi'">
505 <xsl:text disable-output-escaping=
"yes"><![CDATA[rasp
­ber
­ry
­pi]]
></xsl:text>
507 <xsl:when test=
"$MACHINE = 'raspberrypi'">
508 <xsl:text disable-output-escaping=
"yes"><![CDATA[rasp
­ber
­ry
­pi]]
></xsl:text>
511 <xsl:value-of select=
"$MACHINE" />
518 <xsl:template match=
"*" mode=
"yes-no">
520 <xsl:when test=
"@result = 'ok'">
521 <xsl:text>OK
</xsl:text>
523 <xsl:when test=
"@result = 'fail'">
524 <xsl:text>Failed
</xsl:text>
526 <xsl:when test=
"@result = 'skip'">
527 <xsl:text>Skipped
</xsl:text>
530 <xsl:text>?
</xsl:text>
531 <code>(
<xsl:value-of select=
"@result" />)
</code>
536 <xsl:template match=
"*" mode=
"image-link">
537 <xsl:if test=
"@image">
538 <a href=
"{@image}">Image
</a>
542 <xsl:template match=
"*" mode=
"log-link">
544 <a href=
"{@log}">View
</a>
545 <xsl:if test=
"log/logline">
546 (
<a href=
"#" onclick=
"return showHideLog(this, 'log-{generate-id(.)}');">tail
</a>)
551 <xsl:template match=
"*" mode=
"log-link-matrix">
553 <a href=
"{@log}"><xsl:apply-templates select=
"." mode=
"yes-no" /></a>
557 <xsl:template match=
"*" mode=
"duration">
558 <xsl:if test=
"@duration">
559 <xsl:variable name=
"SECONDS" select=
"@duration div 1000" />
560 <xsl:variable name=
"MINUTES" select=
"floor($SECONDS div 60)" />
561 <xsl:variable name=
"HOURS" select=
"floor($MINUTES div 60)" />
563 <xsl:when test=
"$MINUTES > 90">
564 <xsl:value-of select=
"$HOURS" /><xsl:text disable-output-escaping=
"yes"><![CDATA[
 ]]
>h
</xsl:text>
565 <xsl:value-of select=
"format-number($MINUTES - 60 * $HOURS, '#')" /><xsl:text disable-output-escaping=
"yes"><![CDATA[
 ]]
>min
</xsl:text>
567 <xsl:when test=
"$SECONDS > 90">
568 <xsl:value-of select=
"$MINUTES" /><xsl:text disable-output-escaping=
"yes"><![CDATA[
 ]]
>min
</xsl:text>
569 <xsl:value-of select=
"format-number($SECONDS - 60 * $MINUTES, '#')" /><xsl:text disable-output-escaping=
"yes"><![CDATA[
 ]]
>s
</xsl:text>
572 <xsl:value-of select=
"format-number($SECONDS, '#')" /><xsl:text disable-output-escaping=
"yes"><![CDATA[
 ]]
>s
</xsl:text>
575 <!-- (<xsl:value-of select="format-number(@duration div 1000, '#.00')" />s) -->
579 <xsl:template match=
"*" mode=
"log-dump">
580 <xsl:if test=
"count(log/logline) > 0">
581 <tr class=
"logdump log-{generate-id(.)}">
583 <pre><xsl:for-each select=
"log/logline">
584 <xsl:value-of select=
"text()" /><xsl:text>
586 </xsl:for-each></pre>
592 <xsl:template match=
"*" mode=
"download">
593 <xsl:for-each select=
"file">
594 <a href=
"{@filename}"><xsl:value-of select=
"@title" /></a>
595 <xsl:if test=
"not(last())">,
</xsl:if>
597 <xsl:if test=
"not(file)">
598 <xsl:text disable-output-escaping=
"yes"><![CDATA[
—]]
></xsl:text>
604 <xsl:template match=
"*" mode=
"html-failed-task-table-row">
605 <tr class=
"result-fail">
606 <xsl:apply-templates select=
"." mode=
"html-failed-task-table-row-inner" />
608 <xsl:apply-templates select=
"." mode=
"log-link" />
611 <xsl:apply-templates select=
"." mode=
"duration" />
614 <xsl:apply-templates select=
"." mode=
"log-dump" />
617 <xsl:template match=
"checkout" mode=
"html-failed-task-table-row-inner">
618 <td>Repository checkout
</td>
619 <td><xsl:value-of select=
"@repository" /></td>
620 <td><xsl:text disable-output-escaping=
"yes"><![CDATA[
—]]
></xsl:text></td>
623 <xsl:template match=
"harbour-check" mode=
"html-failed-task-table-row-inner">
624 <td>Harbour self-check
</td>
625 <td><xsl:text disable-output-escaping=
"yes"><![CDATA[
—]]
></xsl:text></td>
626 <td><xsl:text disable-output-escaping=
"yes"><![CDATA[
—]]
></xsl:text></td>
629 <xsl:template match=
"harbour-fetch" mode=
"html-failed-task-table-row-inner">
630 <td>Tarball fetch
</td>
631 <td><xsl:value-of select=
"@package" /></td>
632 <td><xsl:text disable-output-escaping=
"yes"><![CDATA[
—]]
></xsl:text></td>
635 <xsl:template match=
"helenos-build" mode=
"html-failed-task-table-row-inner">
637 <td><xsl:text disable-output-escaping=
"yes"><![CDATA[
—]]
></xsl:text></td>
638 <td><xsl:value-of select=
"@arch" /></td>
641 <xsl:template match=
"harbour-build" mode=
"html-failed-task-table-row-inner">
642 <td>Harbour build
</td>
643 <td><xsl:value-of select=
"@package" /></td>
644 <td><xsl:value-of select=
"@arch" /></td>
647 <xsl:template match=
"helenos-extra-build" mode=
"html-failed-task-table-row-inner">
648 <td>Extras build
</td>
649 <td>HelenOS and
<xsl:value-of select=
"@packages" /></td>
650 <td><xsl:value-of select=
"@arch" /></td>
653 <xsl:template match=
"test" mode=
"html-failed-task-table-row-inner">
655 <td><xsl:value-of select=
"@scenario" /></td>
656 <td><xsl:value-of select=
"@arch" /></td>
659 <xsl:template match=
"*" mode=
"html-failed-task-table-row-inner">
660 <td><xsl:value-of select=
"name()" /></td>
661 <td><xsl:text disable-output-escaping=
"yes"><![CDATA[
—]]
></xsl:text></td>
662 <td><xsl:text disable-output-escaping=
"yes"><![CDATA[
—]]
></xsl:text></td>