source: main/trunk/greenstone3/web/interfaces/default/transform/pages/classifier.xsl@ 38991

Last change on this file since 38991 was 38991, checked in by anupama, 6 weeks ago

Dr Bainbridge set it was better to remove the applet shim and in place of JavaScript reading the applet params for any Collage user configuration options in the pageResponse XML, set those user config options as gsf:variables (which do more than xsl:variables by declaring javascript vars besides xslt vars, but need to take care we're not clashing with pre-declared var names). The webswing-collage.xsl Javascript code now uses the gsf:vars in preference to fallback defaults for user-configurable vars, while dynamic vars were already set by the JavaScript if the applet shim didn't set them. Applet shims are entirely phased out. As the Phind classifier doesn't have user config settings that are relevant to instantiating the Phind app, all the phind XSL/JavaScript code checking for any user settings on any applet shim are removed, simplifying the Phind XSL/JS code again. Rechecked the changes. Also checked again for proper shutdown on navigating away (so that part isn't accidentally broken) and checked the phind and collage app pages still respond correct when the webswing extension is deactivated.

File size: 22.1 KB
Line 
1<?xml version="1.0" encoding="UTF-8"?>
2<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xslt/java" xmlns:util="xalan://org.greenstone.gsdl3.util.XSLTUtil" xmlns:gslib="http://www.greenstone.org/skinning" xmlns:gsf="http://www.greenstone.org/greenstone3/schema/ConfigFormat" extension-element-prefixes="java util" exclude-result-prefixes="java util gsf">
3
4 <!-- use the 'main' layout -->
5 <xsl:import href="layouts/main.xsl" />
6 <xsl:import href="layouts/webswing-collage.xsl" />
7 <xsl:import href="map-tools.xsl" />
8 <xsl:import href="panorama-viewer-tools.xsl" />
9
10 <!-- set page title -->
11 <xsl:template name="pageTitle">
12 <gslib:serviceName />
13 </xsl:template>
14
15 <!-- set page breadcrumbs -->
16 <xsl:template name="breadcrumbs">
17 <gslib:siteLink />
18 <gslib:rightArrow />
19 <gslib:groupLinks/>
20 <gslib:collectionNameLinked />
21 <gslib:rightArrow />
22 </xsl:template>
23
24 <!-- the page content -->
25 <xsl:template match="/page/pageResponse">
26 <xsl:call-template name="floatRightSidebar" />
27 <xsl:call-template name="classifierPre" />
28
29 <script type="text/javascript" src="interfaces/{$interface_name}/js/classifier_scripts.js">
30 <xsl:text> </xsl:text>
31 </script>
32 <gsf:script type="text/javascript">$(window).on("load", openStoredClassifiers);</gsf:script>
33
34 <!--
35 Show the clasifier results - you can change the appearance of the results
36 by editing the two templates at the bottom of this file
37 -->
38 <div id="results">
39 <xsl:variable name="collName">
40 <xsl:value-of select="/page/pageRequest/paramList/param[@name='c']/@value" />
41 </xsl:variable>
42 <xsl:variable name="serviceName">
43 <xsl:value-of select="service/@name" />
44 </xsl:variable>
45
46 <xsl:call-template name="classifierResultsPre" />
47
48 <xsl:apply-templates select="classifier">
49 <xsl:with-param name="collName" select="$collName" />
50 <xsl:with-param name="serviceName" select="$serviceName" />
51 </xsl:apply-templates>
52
53 <xsl:call-template name="classifierResultsPost" />
54
55 <xsl:call-template name="classifierPost" />
56 </div>
57
58 <div class="clear">
59 <xsl:text> </xsl:text>
60 </div>
61 </xsl:template>
62
63 <xsl:template name="rightSidebar">
64 <div id="rightSidebar">
65 <xsl:comment>Filler to prevent empty div collapse, in event displayBasket empty</xsl:comment>
66 <gslib:displayBaskets />
67 </div>
68 </xsl:template>
69
70 <xsl:template match="classifier">
71 <xsl:param name="collName" />
72 <xsl:param name="serviceName" />
73 <div id="classifiers">
74 <xsl:variable name="cl_name">
75 <xsl:value-of select="@name" />
76 </xsl:variable>
77 <xsl:choose>
78 <xsl:when test="@childType = 'HList'">
79 <xsl:call-template name="HList">
80 <xsl:with-param name='collName' select='$collName' />
81 <xsl:with-param name='serviceName' select='$serviceName' />
82 </xsl:call-template>
83 </xsl:when>
84 <xsl:otherwise>
85 <table class="childrenlist" id="div{@nodeID}">
86
87 <!--<table id="classifiernodelist">-->
88 <xsl:text> </xsl:text>
89 <xsl:call-template name="processNodeChildren">
90 <xsl:with-param name='collName' select='$collName' />
91 <xsl:with-param name='serviceName' select='$serviceName' />
92 </xsl:call-template>
93 </table>
94 </xsl:otherwise>
95 </xsl:choose>
96 </div>
97 </xsl:template>
98
99 <xsl:template name="HList">
100 <xsl:param name="collName" />
101 <xsl:param name="serviceName" />
102 <xsl:variable name="selectedNode">
103 <xsl:value-of select="/page/pageRequest/paramList/param[@name = 'cl']/@value" />
104 </xsl:variable>
105
106 <ul class="horizontalContainer">
107 <xsl:for-each select='classifierNode'>
108 <li id="title{@nodeID}">
109 <xsl:attribute name="class">
110<!-- <xsl:if test="$selectedNode = @nodeID or starts-with($selectedNode, concat(@nodeID, '.')) or (not(contains($selectedNode, '.')) and @nodeID = concat($selectedNode, '.1'))">selectedHorizontalClassifierNode </xsl:if>-->
111 <xsl:if test="$selectedNode = @nodeID or starts-with($selectedNode, concat(@nodeID, '.')) or (@nodeID = concat($selectedNode, '.1'))">selectedHorizontalClassifierNode </xsl:if>
112 <xsl:text>horizontalClassifierNode</xsl:text>
113 </xsl:attribute>
114 <xsl:apply-templates select='.'>
115 <xsl:with-param name='collName' select='$collName' />
116 <xsl:with-param name='serviceName' select='$serviceName' />
117 </xsl:apply-templates>
118 </li>
119 </xsl:for-each>
120 </ul>
121 <xsl:choose>
122 <!-- if the children are HLists-->
123 <xsl:when test="classifierNode[@childType = 'HList']">
124 <xsl:for-each select='classifierNode'>
125 <!-- there should be only one-->
126 <xsl:call-template name="HList">
127 <xsl:with-param name='collName' select='$collName' />
128 <xsl:with-param name='serviceName' select='$serviceName' />
129 </xsl:call-template>
130 </xsl:for-each>
131 </xsl:when>
132 <xsl:otherwise>
133
134 <div id="classifiernodelist{@nodeID}">
135 <xsl:for-each select='classifierNode'>
136 <xsl:if test="classifierNode|documentNode">
137 <table class="childrenlist" id="div{@nodeID}">
138 <xsl:call-template name="processNodeChildren">
139 <xsl:with-param name='collName' select='$collName' />
140 <xsl:with-param name='serviceName' select='$serviceName' />
141 </xsl:call-template>
142 </table>
143 </xsl:if>
144 </xsl:for-each>
145 </div>
146 </xsl:otherwise>
147 </xsl:choose>
148 </xsl:template>
149
150 <xsl:template name="get-collage-settings">
151 <!-- Creates gsf variables (which sets XSL and JavaScript vars) for any user configured
152 Collage Classifier options coming through collectionConfig and then buildConfig,
153 so that JavaScript can pass them to the webswing instance on starting it up. -->
154 <xsl:choose>
155 <xsl:when test="option[@name='geometry']/@value">
156 <gsf:variable name="collagewidth">
157 <xsl:value-of select="substring-before(option[@name='geometry']/@value, 'x')" />
158 </gsf:variable>
159 <gsf:variable name="collageheight">
160 <xsl:value-of select="substring-after(option[@name='geometry']/@value, 'x')" />
161 </gsf:variable>
162 </xsl:when>
163 </xsl:choose>
164
165 <xsl:choose>
166 <xsl:when test="option[@name='verbosity']/@value">
167 <gsf:variable name="verbosity">
168 <xsl:value-of select="option[@name='verbosity']/@value"/>
169 </gsf:variable>
170 </xsl:when>
171 </xsl:choose>
172 <xsl:choose>
173 <xsl:when test="option[@name='imageMustNotHave']/@value">
174 <gsf:variable name="imageMustNotHave">
175 <xsl:value-of select="option[@name='imageMustNotHave']/@value"/>
176 </gsf:variable>
177 </xsl:when>
178 </xsl:choose>
179 <xsl:choose>
180 <xsl:when test="option[@name='imageType']/@value">
181 <gsf:variable name="imageType">
182 <xsl:value-of select="option[@name='imageType']/@value"/>
183 </gsf:variable>
184 </xsl:when>
185 </xsl:choose>
186 <xsl:choose>
187 <xsl:when test="option[@name='maxDepth']/@value">
188 <gsf:variable name="maxDepth">
189 <xsl:value-of select="option[@name='maxDepth']/@value"/>
190 </gsf:variable>
191 </xsl:when>
192 </xsl:choose>
193 <xsl:choose>
194 <xsl:when test="option[@name='maxDisplay']/@value">
195 <gsf:variable name="maxDisplay">
196 <xsl:value-of select="option[@name='maxDisplay']/@value"/>
197 </gsf:variable>
198 </xsl:when>
199 </xsl:choose>
200 <xsl:choose>
201 <xsl:when test="option[@name='refreshDelay']/@value">
202 <gsf:variable name="refreshDelay">
203 <xsl:value-of select="option[@name='refreshDelay']/@value"/>
204 </gsf:variable>
205 </xsl:when>
206 </xsl:choose>
207 <xsl:choose>
208 <xsl:when test="option[@name='isJava2']/@value">
209 <gsf:variable name="isJava2">
210 <xsl:value-of select="option[@name='isJava2']/@value"/>
211 </gsf:variable>
212 </xsl:when>
213 </xsl:choose>
214 <xsl:choose>
215 <xsl:when test="option[@name='bgcolor']/@value">
216 <gsf:variable name="bgcolor">
217 <xsl:value-of select="option[@name='bgcolor']/@value"/>
218 </gsf:variable>
219 </xsl:when>
220 </xsl:choose>
221
222 <!--
223 Defaults to fall back on when there is no user customisation
224 can be manually adjusted here. -->
225 <!--
226 <xsl:call-template name="set-collage-gsfvar-if-exists">
227 <xsl:with-param name="varName">imageMustNotHave</xsl:with-param>
228 </xsl:call-template>
229 <xsl:call-template name="set-collage-gsfvar-if-exists">
230 <xsl:with-param name="varName">imageType</xsl:with-param>
231 </xsl:call-template>
232 <xsl:call-template name="set-collage-gsfvar-if-exists">
233 <xsl:with-param name="varName">verbosity</xsl:with-param>
234 </xsl:call-template>
235 <xsl:call-template name="set-collage-gsfvar-if-exists">
236 <xsl:with-param name="varName">maxDepth</xsl:with-param>
237 </xsl:call-template>
238 <xsl:call-template name="set-collage-gsfvar-if-exists">
239 <xsl:with-param name="varName">maxDisplay</xsl:with-param>
240 </xsl:call-template>
241 <xsl:call-template name="set-collage-gsfvar-if-exists">
242 <xsl:with-param name="varName">refreshDelay</xsl:with-param>
243 </xsl:call-template>
244 <xsl:call-template name="set-collage-gsfvar-if-exists">
245 <xsl:with-param name="varName">isJava2</xsl:with-param>
246 </xsl:call-template>
247 <xsl:call-template name="set-collage-gsfvar-if-exists">
248 <xsl:with-param name="varName">bgcolor</xsl:with-param>
249 </xsl:call-template>
250 -->
251 </xsl:template>
252
253 <!-- https://our.umbraco.com/forum/developers/xslt/9274-Return-Value-from-a-Template -->
254 <xsl:template name="set-collage-gsfvar-if-exists">
255 <xsl:param name="varName" />
256 <!--<xsl:value-of select="$varName"/>-->
257 <xsl:choose>
258 <xsl:when test="option[@name=$varName]/@value">
259 <gsf:variable name="$varName">
260 <!--<xsl:attribute name="name"><xsl:value-of select="$varName" /></xsl:attribute>-->
261 <xsl:value-of select="option[@name=$varName]/@value"/>
262 </gsf:variable>
263 </xsl:when>
264 </xsl:choose>
265 </xsl:template>
266
267 <xsl:template name="Collage_javascript_deprecated">
268 <script type="text/javascript" src="interfaces/{$interface_name}/js/collage_scripts.js"><xsl:text> </xsl:text></script>
269 <div id="collagewrapper" style="width: 800px; height: 643px; position: relative; background-image:url('sites/{$site_name}/collect/twso/images/oldimagebackground1.png'); text-align: center;" alt="Click to start/stop a collage of images" title="Click to start/stop a collage of images" onmouseover="" onmouseout=""><xsl:text> </xsl:text></div>
270
271 </xsl:template>
272
273 <xsl:template name="processNodeChildren">
274 <xsl:param name="collName" />
275 <xsl:param name="serviceName" />
276
277 <xsl:choose>
278
279 <xsl:when test="@childType = 'VList' or @childType = 'DateList'">
280 <!--
281 <xsl:when test="@childType = 'VList' or @childType = 'HList' or @childType = 'DateList'"> - - **** mod ???? - -
282 -->
283
284 <xsl:value-of select="util:storeString('prevMonth', '')" />
285 <xsl:for-each select='classifierNode|documentNode'>
286 <tr>
287 <xsl:choose>
288 <xsl:when test="name()='documentNode'">
289 <xsl:if test="../@childType = 'DateList'">
290 <xsl:variable name="prevMonth">
291 <xsl:value-of select="util:getString('prevMonth')" />
292 </xsl:variable>
293 <xsl:variable name="currentDate">
294 <gsf:metadata name="Date" pos="1" />
295 </xsl:variable> <!-- note pos=1 won't work if a document can be included in a datelist multiple times. currently only the first date is used...-->
296 <xsl:variable name="currentMonth">
297 <xsl:value-of select="util:getDetailFromDate($currentDate, 'month', /page/@lang)" />
298 </xsl:variable>
299 <xsl:value-of select="util:storeString('prevMonth', $currentMonth)" />
300 <td>
301 <xsl:if test="not($currentMonth = $prevMonth)">
302 <xsl:value-of select="$currentMonth" />
303 </xsl:if>
304 <xsl:text> </xsl:text>
305 </td>
306 </xsl:if>
307 <td>
308 <table id="div{@nodeID}">
309 <tr>
310 <xsl:call-template name="documentNodeWrapper">
311 <xsl:with-param name='collName' select='$collName' />
312 <xsl:with-param name='serviceName' select='$serviceName' />
313 </xsl:call-template>
314 </tr>
315 </table>
316 </td>
317 </xsl:when>
318 <xsl:when test="name()='classifierNode' and (@childType = 'VList' or @childType = 'HList')">
319 <!-- *** mod -->
320 <td>
321 <table id="title{@nodeID}">
322 <tr>
323 <xsl:if test="not(/page/pageResponse/format[@type='browse']/gsf:option[@name='turnstyleClassifiers']) or /page/pageResponse/format[@type='browse']/gsf:option[@name='turnstyleClassifiers']/@value='true'">
324 <td class="headerTD">
325 <img id="toggle{@nodeID}" onclick="toggleSection('{@nodeID}');" class="icon turnstyleicon">
326 <xsl:attribute name="src">
327 <xsl:choose>
328 <xsl:when test="classifierNode or documentNode">
329 <xsl:value-of select="util:getInterfaceText($interface_name, /page/@lang, 'collapse_image')" />
330 </xsl:when>
331 <xsl:otherwise>
332 <xsl:value-of select="util:getInterfaceText($interface_name, /page/@lang, 'expand_image')" />
333 </xsl:otherwise>
334 </xsl:choose>
335 </xsl:attribute>
336 </img>
337 </td>
338 </xsl:if>
339 <xsl:apply-templates select='.'>
340 <xsl:with-param name='collName' select='$collName' />
341 <xsl:with-param name='serviceName' select='$serviceName' />
342 </xsl:apply-templates>
343 </tr>
344 </table>
345 </td>
346 <xsl:if test="child::classifierNode or child::documentNode">
347 <!--recurse into the children-->
348 <tr>
349 <td>
350 <table class="childrenlist" id="div{@nodeID}">
351
352 <xsl:apply-templates select='.' mode='process-all-children'>
353 <xsl:with-param name='collName' select='$collName' />
354 <xsl:with-param name='serviceName' select='$serviceName' />
355 </xsl:apply-templates>
356 </table>
357 </td>
358 </tr>
359 </xsl:if>
360 </xsl:when>
361 <xsl:otherwise>
362 <td>
363 Unknown classifier style specified:
364 <xsl:value-of select="name()" />
365 </td>
366 </xsl:otherwise>
367 </xsl:choose>
368 </tr>
369 </xsl:for-each>
370 </xsl:when>
371 <xsl:when test="@childType = 'HTML'">
372 <xsl:variable name="URL">
373 <xsl:value-of select="documentNode/@nodeID" />
374 </xsl:variable>
375 <iframe width="100%" height="600" frameborder="0">
376 <xsl:attribute name="src">
377 <xsl:value-of select="$URL" />
378 </xsl:attribute>
379 Frame for
380 <xsl:value-of select="$URL" />
381 </iframe>
382 </xsl:when>
383 <xsl:when test="@childType = 'Collage'">
384 <xsl:choose>
385 <!--test of not(*) means has no children, not(classNode) has no subelements classNode-->
386 <xsl:when test="not(classifierNode)">
387 <!-- the order of calling these templates now matters since the collage applet now
388 serves as a shim in the javascript that gets loaded in the 2nd template call:
389 the javascript now reads in the applet's parameters and uses them to configure
390 the webswing application/applet. It appeared better than the entirely javascript
391 solution we already had (which set the webswing arguments from the pageRequest
392 and xslt variables), as javascript requires familiarity with programming and
393 library designers/developers/we may find it easier to configure applet params
394 than learn/remember how to set webswing params or use javascript.
395 -->
396 <xsl:call-template name="get-collage-settings" />
397 <div id="collage-displaying-info" style="display:none">The Collage Java App</div>
398 <xsl:call-template name="webswing-embed-collage"/>
399 </xsl:when>
400 <xsl:otherwise>
401 <xsl:apply-templates select='classifierNode|documentNode' mode='process-all-children'>
402 <xsl:with-param name='collName' select='$collName' />
403 <xsl:with-param name='serviceName' select='$serviceName' />
404 </xsl:apply-templates>
405 </xsl:otherwise>
406 </xsl:choose>
407 </xsl:when>
408 <xsl:otherwise>
409 we are in the other wise
410 </xsl:otherwise>
411 </xsl:choose>
412 </xsl:template>
413
414 <!-- processing for the recursive bit -->
415 <xsl:template match="classifierNode" mode="process-all-children">
416 <xsl:param name="collName" />
417 <xsl:param name="serviceName" />
418
419 <!--
420 ***mod: previous, simpler version
421 <xsl:call-template name="processNodeChildren">
422 <xsl:with-param name='collName' select='$collName'/>
423 <xsl:with-param name='serviceName' select='$serviceName'/>
424 </xsl:call-template>
425 -->
426
427 <xsl:choose>
428 <xsl:when test="@childType = 'HList'">
429 <tr><td>
430 <xsl:call-template name="HList">
431 <xsl:with-param name='collName' select='$collName' />
432 <xsl:with-param name='serviceName' select='$serviceName' />
433 </xsl:call-template>
434 </td></tr>
435 </xsl:when>
436 <xsl:otherwise>
437 <xsl:call-template name="processNodeChildren">
438 <xsl:with-param name='collName' select='$collName' />
439 <xsl:with-param name='serviceName' select='$serviceName' />
440 </xsl:call-template>
441 </xsl:otherwise>
442 </xsl:choose>
443
444 </xsl:template>
445
446 <!-- this is a wrapper node, which the interface can use to add stuff into the classifier display that isn't part of and doesn't depend on the documentNode template which may come from the collection -->
447 <xsl:template name="documentNodeWrapper">
448 <xsl:param name="collName" />
449 <xsl:param name="serviceName" />
450
451 <!-- The favourite star (optional) -->
452 <xsl:if test="$favouriteBasketOn">
453 <td valign="top">
454 <xsl:call-template name="documentFavouriteForClassifierOrSearchPage" />
455 </td>
456 </xsl:if>
457
458 <xsl:apply-templates select=".">
459 <xsl:with-param name="collName" select="$collName" />
460 <xsl:with-param name="serviceName" select="$serviceName" />
461 </xsl:apply-templates>
462
463 <xsl:call-template name="documentNodePost" />
464 </xsl:template>
465
466 <!--
467 TEMPLATE FOR DOCUMENTS
468 -->
469 <xsl:template match="documentNode">
470 <td valign="top">
471 <gsf:link type="document">
472 <gsf:icon type="document" />
473 </gsf:link>
474 </td>
475 <td valign="top">
476 <gsf:link type="source">
477 <gsf:choose-metadata>
478 <gsf:metadata name="thumbicon" />
479 <gsf:metadata name="srcicon" />
480 </gsf:choose-metadata>
481 </gsf:link>
482 </td>
483 <td valign="top">
484 <gsf:link type="document">
485 <!-- Defined in header.xsl -->
486 <xsl:call-template name="choose-title" />
487 <gsf:switch>
488 <gsf:metadata name="Source" />
489 <gsf:when test="exists">
490 <br />
491 <i>
492 (
493 <gsf:metadata name="Source" />
494 )
495 </i>
496 </gsf:when>
497 </gsf:switch>
498 </gsf:link>
499 </td>
500 </xsl:template>
501
502 <xsl:template name="documentNodePost">
503 <xsl:if test="/page/pageResponse/format[@type='display' or @type='browse' or @type='search']/gsf:option[@name='mapEnabled']/@value = 'true'">
504 <xsl:if test="metadataList/metadata[@name='Latitude' or @name='Longitude' or @name='Coordinate']">
505 <xsl:call-template name="mapFeaturesIcon" />
506 </xsl:if>
507 </xsl:if>
508
509 <xsl:if test="/page/pageResponse/format/gsf:option[@name='panoramaViewerEnabled']/@value = 'true'">
510 <xsl:if test="metadataList/metadata[@name = 'PhotoType']='Panorama' and ( metadataList/metadata[@name = 'Coordinate'] or ( metadataList/metadata[@name = 'Latitude'] and metadataList/metadata[@name = 'Longitude']))">
511 <xsl:call-template name="panoramaViewerFeaturesIcon" />
512 </xsl:if>
513 </xsl:if>
514
515 </xsl:template>
516
517 <!--
518 TEMPLATE FOR GROUPS OF DOCUMENTS
519 -->
520 <xsl:template match="classifierNode[@classifierStyle = 'HList']">
521 <gsf:link type="classifier">
522 <gsf:metadata name="Title" />
523 </gsf:link>
524 </xsl:template>
525
526 <xsl:template match="classifierNode">
527 <td valign="top">
528 <gsf:link type="classifier" style="static">
529 <gsf:icon type="classifier" />
530 </gsf:link>
531 </td>
532 <td valign="top">
533 <gsf:link type="classifier">
534 <gsf:metadata name="Title" />
535 </gsf:link>
536 </td>
537 </xsl:template>
538
539 <xsl:template name="classifierPre">
540 <xsl:if test="/page/pageResponse/format[@type='display' or @type='browse' or @type='search']/gsf:option[@name='mapEnabled']/@value = 'true'">
541 <xsl:call-template name="mapFeaturesJSONNodes" />
542 </xsl:if>
543
544 <xsl:if test="/page/pageResponse/format/gsf:option[@name='panoramaViewerEnabled']/@value = 'true'">
545 <xsl:call-template name="panoramaViewerFeaturesJSONNodes" />
546 </xsl:if>
547
548 </xsl:template>
549
550 <xsl:template name="classifierResultsPre">
551 <xsl:if test="/page/pageResponse/format[@type='display' or @type='browse' or @type='search']/gsf:option[@name='mapEnabled']/@value = 'true'">
552 <xsl:call-template name="mapFeaturesMap" />
553 </xsl:if>
554 <xsl:if test="/page/pageResponse/format/gsf:option[@name='panoramaViewerEnabled']/@value = 'true'">
555 <xsl:call-template name="panoramaViewerFeatures" />
556 </xsl:if>
557 </xsl:template>
558
559 <xsl:template name="classifierResultsPost">
560 </xsl:template>
561
562 <xsl:template name="classifierPost">
563 </xsl:template>
564
565 <xsl:template match="/page/xsltparams">
566 <!-- suppress xsltparam block in page -->
567 </xsl:template>
568
569</xsl:stylesheet>
Note: See TracBrowser for help on using the repository browser.