source: BLFS/xsl/scripts.xsl@ f769d1f

new_features
Last change on this file since f769d1f was ed4f11f, checked in by Pierre Labastie <pierre@…>, 8 years ago

Invert the logic for downloading tarballs:

  • First upstream url
  • Second upstrem ftp
  • Last mirror server.

This allows to test whether upstream links are alive

  • Property mode set to 100644
File size: 20.8 KB
Line 
1<?xml version="1.0"?>
2
3<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4 xmlns:exsl="http://exslt.org/common"
5 extension-element-prefixes="exsl"
6 version="1.0">
7
8<!-- $Id: scripts.xsl 34 2012-02-21 16:05:09Z labastie $ -->
9
10<!-- XSLT stylesheet to create shell scripts from "linear build" BLFS books. -->
11
12 <!-- Wrap "root" commands inside a wrapper function, allowing
13 "porg style" package management -->
14 <xsl:param name="wrap-install" select="'n'"/>
15
16 <!-- Build as user (y) or as root (n)? -->
17 <xsl:param name="sudo" select="'y'"/>
18
19 <xsl:template match="/">
20 <xsl:apply-templates select="//sect1"/>
21 </xsl:template>
22
23<!--=================== Master chunks code ======================-->
24
25 <xsl:template match="sect1">
26
27 <xsl:if test="@id != 'bootscripts'">
28 <!-- The file names -->
29 <xsl:variable name="filename" select="@id"/>
30
31 <!-- The build order -->
32 <xsl:variable name="position" select="position()"/>
33 <xsl:variable name="order">
34 <xsl:choose>
35 <xsl:when test="string-length($position) = 1">
36 <xsl:text>00</xsl:text>
37 <xsl:value-of select="$position"/>
38 </xsl:when>
39 <xsl:when test="string-length($position) = 2">
40 <xsl:text>0</xsl:text>
41 <xsl:value-of select="$position"/>
42 </xsl:when>
43 <xsl:otherwise>
44 <xsl:value-of select="$position"/>
45 </xsl:otherwise>
46 </xsl:choose>
47 </xsl:variable>
48
49 <!-- Depuration code -->
50 <xsl:message>
51 <xsl:text>SCRIPT is </xsl:text>
52 <xsl:value-of select="concat($order,'-z-',$filename)"/>
53 <xsl:text>&#xA; FTPDIR is </xsl:text>
54 <xsl:value-of select="$filename"/>
55 <xsl:text>&#xA;&#xA;</xsl:text>
56 </xsl:message>
57
58 <!-- Creating the scripts -->
59 <exsl:document href="{$order}-z-{$filename}" method="text">
60 <xsl:text>#!/bin/bash&#xA;set -e&#xA;&#xA;</xsl:text>
61 <xsl:choose>
62 <!-- Package page -->
63 <xsl:when test="sect2[@role='package']">
64 <!-- We build in a subdirectory, whose name may be needed
65 if using package management (see envars.conf), so
66 "export" it -->
67 <xsl:text>export PKG_DIR=</xsl:text>
68 <xsl:value-of select="$filename"/>
69 <xsl:text>&#xA;</xsl:text>
70 <!-- Download code and build commands -->
71 <xsl:apply-templates select="sect2"/>
72 <!-- Clean-up -->
73 <xsl:text>cd $SRC_DIR/$PKG_DIR&#xA;</xsl:text>
74 <!-- In some case, some files in the build tree are owned
75 by root -->
76 <xsl:if test="$sudo='y'">
77 <xsl:text>sudo </xsl:text>
78 </xsl:if>
79 <xsl:text>rm -rf $UNPACKDIR unpacked&#xA;&#xA;</xsl:text>
80 </xsl:when>
81 <!-- Non-package page -->
82 <xsl:otherwise>
83 <xsl:apply-templates select=".//screen"/>
84 </xsl:otherwise>
85 </xsl:choose>
86 <xsl:text>exit</xsl:text>
87 </exsl:document>
88 </xsl:if>
89 </xsl:template>
90
91<!--======================= Sub-sections code =======================-->
92
93 <xsl:template match="sect2">
94 <xsl:choose>
95 <xsl:when test="@role = 'package'">
96 <xsl:text>mkdir -p $SRC_DIR/$PKG_DIR&#xA;</xsl:text>
97 <xsl:text>cd $SRC_DIR/$PKG_DIR&#xA;</xsl:text>
98 <!-- Download information is in bridgehead tags -->
99 <xsl:apply-templates select="bridgehead[@renderas='sect3']"/>
100 <xsl:text>&#xA;</xsl:text>
101 </xsl:when>
102 <xsl:when test="@role = 'qt4-prefix' or @role = 'qt5-prefix'">
103 <xsl:apply-templates select=".//screen"/>
104 </xsl:when>
105 <xsl:when test="@role = 'installation'">
106 <xsl:text>
107find . -maxdepth 1 -mindepth 1 -type d | xargs </xsl:text>
108 <xsl:if test="$sudo='y'">
109 <xsl:text>sudo </xsl:text>
110 </xsl:if>
111 <xsl:text>rm -rf
112case $PACKAGE in
113 *.tar.gz|*.tar.bz2|*.tar.xz|*.tgz|*.tar.lzma)
114 tar -xvf $PACKAGE &gt; unpacked
115 UNPACKDIR=`grep '[^./]\+' unpacked | head -n1 | sed 's@^./@@;s@/.*@@'`
116 ;;
117 *.zip)
118 zipinfo -1 $PACKAGE &gt; unpacked
119 UNPACKDIR="$(sed 's@/.*@@' unpacked | uniq )"
120 if test $(wc -w &lt;&lt;&lt; $UNPACKDIR) -eq 1; then
121 unzip $PACKAGE
122 else
123 UNPACKDIR=${PACKAGE%.zip}
124 unzip -d $UNPACKDIR $PACKAGE
125 fi
126 ;;
127 *)
128 UNPACKDIR=$PKG_DIR-build
129 mkdir $UNPACKDIR
130 cp $PACKAGE $UNPACKDIR
131 ;;
132esac
133export UNPACKDIR
134cd $UNPACKDIR&#xA;
135</xsl:text>
136 <xsl:apply-templates select=".//screen | .//para/command"/>
137 <xsl:if test="$sudo = 'y'">
138 <xsl:text>sudo /sbin/</xsl:text>
139 </xsl:if>
140 <xsl:text>ldconfig&#xA;&#xA;</xsl:text>
141 </xsl:when>
142 <xsl:when test="@role = 'configuration'">
143 <xsl:apply-templates select=".//screen" mode="config"/>
144 </xsl:when>
145 </xsl:choose>
146 </xsl:template>
147
148<!--==================== Download code =======================-->
149
150 <!-- template for extracting the filename from an url in the form:
151 proto://internet.name/dir1/.../dirn/filename?condition.
152 Needed, because substring-after(...,'/') returns only the
153 substring after the first '/'. -->
154 <xsl:template name="package_name">
155 <xsl:param name="url" select="foo"/>
156 <xsl:param name="sub-url" select="substring-after($url,'/')"/>
157 <xsl:choose>
158 <xsl:when test="contains($sub-url,'/')">
159 <xsl:call-template name="package_name">
160 <xsl:with-param name="url" select="$sub-url"/>
161 </xsl:call-template>
162 </xsl:when>
163 <xsl:otherwise>
164 <xsl:choose>
165 <xsl:when test="contains($sub-url,'?')">
166 <xsl:value-of select="substring-before($sub-url,'?')"/>
167 </xsl:when>
168 <xsl:otherwise>
169 <xsl:value-of select="$sub-url"/>
170 </xsl:otherwise>
171 </xsl:choose>
172 </xsl:otherwise>
173 </xsl:choose>
174 </xsl:template>
175
176 <!-- Generates the code to download a package, an additional package or
177 a patch. -->
178 <xsl:template name="download-file">
179 <xsl:param name="httpurl" select="''"/>
180 <xsl:param name="ftpurl" select="''"/>
181 <xsl:param name="md5" select="''"/>
182 <xsl:param name="varname" select="''"/>
183 <xsl:variable name="package">
184 <xsl:call-template name="package_name">
185 <xsl:with-param name="url">
186 <xsl:choose>
187 <xsl:when test="string-length($httpurl) &gt; 10">
188 <xsl:value-of select="$httpurl"/>
189 </xsl:when>
190 <xsl:otherwise>
191 <xsl:value-of select="$ftpurl"/>
192 </xsl:otherwise>
193 </xsl:choose>
194 </xsl:with-param>
195 </xsl:call-template>
196 </xsl:variable>
197 <xsl:variable name="first_letter"
198 select="translate(substring($package,1,1),
199 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
200 'abcdefghijklmnopqrstuvwxyz')"/>
201 <xsl:text>&#xA;</xsl:text>
202 <xsl:value-of select="$varname"/>
203 <xsl:text>=</xsl:text>
204 <xsl:value-of select="$package"/>
205 <xsl:text>&#xA;if [[ ! -f $</xsl:text>
206 <xsl:value-of select="$varname"/>
207 <xsl:text> ]] ; then&#xA;</xsl:text>
208 <!-- SRC_ARCHIVE may have subdirectories or not -->
209 <xsl:text> if [[ -f $SRC_ARCHIVE/$PKG_DIR/$</xsl:text>
210 <xsl:value-of select="$varname"/>
211 <xsl:text> ]] ; then&#xA;</xsl:text>
212 <xsl:text> cp $SRC_ARCHIVE/$PKG_DIR/$</xsl:text>
213 <xsl:value-of select="$varname"/>
214 <xsl:text> $</xsl:text>
215 <xsl:value-of select="$varname"/>
216 <xsl:text>&#xA;</xsl:text>
217 <xsl:text> elif [[ -f $SRC_ARCHIVE/$</xsl:text>
218 <xsl:value-of select="$varname"/>
219 <xsl:text> ]] ; then&#xA;</xsl:text>
220 <xsl:text> cp $SRC_ARCHIVE/$</xsl:text>
221 <xsl:value-of select="$varname"/>
222 <xsl:text> $</xsl:text>
223 <xsl:value-of select="$varname"/>
224 <xsl:text>&#xA; else&#xA;</xsl:text>
225 <!-- Download from upstream http -->
226 <xsl:if test="string-length($httpurl) &gt; 10">
227 <xsl:text> wget -T 30 -t 5 </xsl:text>
228 <xsl:value-of select="$httpurl"/>
229 <xsl:text> ||&#xA;</xsl:text>
230 </xsl:if>
231 <!-- Download from upstream ftp -->
232 <xsl:if test="string-length($ftpurl) &gt; 10">
233 <xsl:text> wget -T 30 -t 5 </xsl:text>
234 <xsl:value-of select="$ftpurl"/>
235 <xsl:text> ||&#xA;</xsl:text>
236 </xsl:if>
237 <!-- The FTP_SERVER mirror as a last resort -->
238 <xsl:text> wget -T 30 -t 5 ${FTP_SERVER}svn/</xsl:text>
239 <xsl:value-of select="$first_letter"/>
240 <xsl:text>/$</xsl:text>
241 <xsl:value-of select="$varname"/>
242 <xsl:text>
243 cp $</xsl:text>
244 <xsl:value-of select="$varname"/>
245 <xsl:text> $SRC_ARCHIVE
246 fi
247fi
248</xsl:text>
249 <xsl:if test="string-length($md5) &gt; 10">
250 <xsl:text>echo "</xsl:text>
251 <xsl:value-of select="$md5"/>
252 <xsl:text>&#x20;&#x20;$</xsl:text>
253 <xsl:value-of select="$varname"/>
254 <xsl:text>" | md5sum -c -
255</xsl:text>
256 </xsl:if>
257 </xsl:template>
258
259 <!-- Extract the MD5 sum information -->
260 <xsl:template match="para" mode="md5">
261 <xsl:choose>
262 <xsl:when test="contains(substring-after(string(),'sum: '),'&#xA;')">
263 <xsl:value-of select="substring-before(substring-after(string(),'sum: '),'&#xA;')"/>
264 </xsl:when>
265 <xsl:otherwise>
266 <xsl:value-of select="substring-after(string(),'sum: ')"/>
267 </xsl:otherwise>
268 </xsl:choose>
269 </xsl:template>
270
271 <!-- We have several templates itemizedlist, depending on whether we
272 expect the package information, or additional package(s) or patch(es)
273 information. Select the appropriate mode here. -->
274 <xsl:template match="bridgehead">
275 <xsl:choose>
276 <!-- Special case for Openjdk -->
277 <xsl:when test="contains(string(),'Source Package Information')">
278 <xsl:apply-templates
279 select="following-sibling::itemizedlist[1]//simplelist">
280 <xsl:with-param name="varname" select="'PACKAGE'"/>
281 </xsl:apply-templates>
282 <xsl:apply-templates select="following-sibling::itemizedlist
283 [preceding-sibling::bridgehead[1]=current()
284 and position() &gt;1]//simplelist">
285 <xsl:with-param name="varname" select="'PACKAGE1'"/>
286 </xsl:apply-templates>
287 </xsl:when>
288 <!-- Package information -->
289 <xsl:when test="contains(string(),'Package Information')">
290 <xsl:apply-templates select="following-sibling::itemizedlist
291 [preceding-sibling::bridgehead[1]=current()]"
292 mode="package"/>
293 </xsl:when>
294 <!-- Additional package information -->
295 <!-- special case for llvm -->
296 <xsl:when test="contains(string(),'Optional Download')">
297 <xsl:apply-templates select="following-sibling::itemizedlist"
298 mode="additional"/>
299 </xsl:when>
300 <!-- All other additional packages have "Additional" -->
301 <xsl:when test="contains(string(),'Additional')">
302 <xsl:apply-templates select="following-sibling::itemizedlist"
303 mode="additional"/>
304 </xsl:when>
305 <!-- Do not do anything if the dev has created another type of
306 bridgehead. -->
307 <xsl:otherwise/>
308 </xsl:choose>
309 </xsl:template>
310
311 <!-- Call the download code template with appropriate parameters -->
312 <xsl:template match="itemizedlist" mode="package">
313 <xsl:call-template name="download-file">
314 <xsl:with-param name="httpurl">
315 <xsl:value-of select="./listitem[1]/para/ulink/@url"/>
316 </xsl:with-param>
317 <xsl:with-param name="ftpurl">
318 <xsl:value-of select="./listitem/para[contains(string(),'FTP')]/ulink/@url"/>
319 </xsl:with-param>
320 <xsl:with-param name="md5">
321 <xsl:apply-templates select="./listitem/para[contains(string(),'MD5')]"
322 mode="md5"/>
323 </xsl:with-param>
324 <xsl:with-param name="varname" select="'PACKAGE'"/>
325 </xsl:call-template>
326 </xsl:template>
327
328 <xsl:template match="itemizedlist" mode="additional">
329 <!-- The normal layout is "one listitem"<->"one url", but some devs
330 find amusing to have FTP and/or MD5sum listitems, or to
331 enclose the download information inside a simplelist tag... -->
332 <xsl:for-each select="listitem[.//ulink]">
333 <xsl:choose>
334 <!-- hopefully, there was a HTTP line before -->
335 <xsl:when test="contains(string(./para),'FTP')"/>
336 <xsl:when test=".//simplelist">
337 <xsl:apply-templates select=".//simplelist">
338 <xsl:with-param name="varname" select="'PACKAGE1'"/>
339 </xsl:apply-templates>
340 </xsl:when>
341 <xsl:otherwise>
342 <xsl:call-template name="download-file">
343 <xsl:with-param name="httpurl">
344 <xsl:value-of select="./para/ulink/@url"/>
345 </xsl:with-param>
346 <xsl:with-param name="ftpurl">
347 <xsl:value-of
348 select="following-sibling::listitem[1]/
349 para[contains(string(),'FTP')]/ulink/@url"/>
350 </xsl:with-param>
351 <xsl:with-param name="md5">
352 <xsl:apply-templates
353 select="following-sibling::listitem[position()&lt;3]/
354 para[contains(string(),'MD5')]"
355 mode="md5"/>
356 </xsl:with-param>
357 <xsl:with-param name="varname">
358 <xsl:choose>
359 <xsl:when test="contains(./para/ulink/@url,'.patch')">
360 <xsl:text>PATCH</xsl:text>
361 </xsl:when>
362 <xsl:otherwise>
363 <xsl:text>PACKAGE1</xsl:text>
364 </xsl:otherwise>
365 </xsl:choose>
366 </xsl:with-param>
367 </xsl:call-template>
368 </xsl:otherwise>
369 </xsl:choose>
370 </xsl:for-each>
371 </xsl:template>
372
373 <!-- the simplelist case. Hopefully, the layout is one member for
374 url, one for md5 and others for various information, that we do not
375 use -->
376 <xsl:template match="simplelist">
377 <xsl:param name="varname" select="'PACKAGE1'"/>
378 <xsl:call-template name="download-file">
379 <xsl:with-param name="httpurl" select=".//ulink/@url"/>
380 <xsl:with-param name="md5">
381 <xsl:value-of select="substring-after(member[contains(string(),'MD5')],'sum: ')"/>
382 </xsl:with-param>
383 <xsl:with-param name="varname" select="$varname"/>
384 </xsl:call-template>
385 </xsl:template>
386<!--======================== Commands code ==========================-->
387
388 <xsl:template match="screen">
389 <xsl:if test="child::* = userinput and not(@role = 'nodump')">
390 <xsl:choose>
391 <xsl:when test="@role = 'root'">
392 <xsl:if test="not(preceding-sibling::screen[1][@role='root'])">
393 <xsl:if test="$sudo = 'y'">
394 <xsl:text>sudo -E sh &lt;&lt; ROOT_EOF&#xA;</xsl:text>
395 </xsl:if>
396 <xsl:if test="$wrap-install = 'y' and
397 ancestor::sect2[@role='installation']">
398 <xsl:text>if [ -r "$PACK_INSTALL" ]; then
399 source $PACK_INSTALL
400 export -f wrapInstall
401 export -f packInstall
402fi
403wrapInstall '
404</xsl:text>
405 </xsl:if>
406 </xsl:if>
407 <xsl:apply-templates mode="root"/>
408 <xsl:if test="not(following-sibling::screen[1][@role='root'])">
409 <xsl:if test="$wrap-install = 'y' and
410 ancestor::sect2[@role='installation']">
411 <xsl:text>'&#xA;packInstall</xsl:text>
412 </xsl:if>
413 <xsl:if test="$sudo = 'y'">
414 <xsl:text>&#xA;ROOT_EOF</xsl:text>
415 </xsl:if>
416 </xsl:if>
417 </xsl:when>
418 <xsl:otherwise>
419 <xsl:apply-templates select="userinput"/>
420 </xsl:otherwise>
421 </xsl:choose>
422 <xsl:text>&#xA;</xsl:text>
423 </xsl:if>
424 </xsl:template>
425
426 <xsl:template match="screen" mode="config">
427 <xsl:if test="preceding-sibling::para[1]/xref[@linkend='bootscripts']">
428 <xsl:text>[[ ! -d $SRC_DIR/blfs-bootscripts ]] &amp;&amp; mkdir $SRC_DIR/blfs-bootscripts
429pushd $SRC_DIR/blfs-bootscripts
430URL=</xsl:text>
431 <xsl:value-of select="id('bootscripts')//itemizedlist//ulink/@url"/><xsl:text>
432BOOTPACKG=$(basename $URL)
433if [[ ! -f $BOOTPACKG ]] ; then
434 if [[ -f $SRC_ARCHIVE/$PKG_DIR/$BOOTPACKG ]] ; then
435 cp $SRC_ARCHIVE/$PKG_DIR/$BOOTPACKG $BOOTPACKG
436 elif [[ -f $SRC_ARCHIVE/$BOOTPACKG ]] ; then
437 cp $SRC_ARCHIVE/$BOOTPACKG $BOOTPACKG
438 else
439 wget -T 30 -t 5 $URL
440 cp $BOOTPACKG $SRC_ARCHIVE
441 fi
442 rm -f unpacked
443fi
444
445if [[ -e unpacked ]] ; then
446 BOOTUNPACKDIR=`head -n1 unpacked | sed 's@^./@@;s@/.*@@'`
447 if ! [[ -d $BOOTUNPACKDIR ]]; then
448 rm unpacked
449 tar -xvf $BOOTPACKG > unpacked
450 BOOTUNPACKDIR=`head -n1 unpacked | sed 's@^./@@;s@/.*@@'`
451 fi
452else
453 tar -xvf $BOOTPACKG > unpacked
454 BOOTUNPACKDIR=`head -n1 unpacked | sed 's@^./@@;s@/.*@@'`
455fi
456cd $BOOTUNPACKDIR
457</xsl:text>
458 </xsl:if>
459 <xsl:apply-templates select='.'/>
460 <xsl:if test="preceding-sibling::para[1]/xref[@linkend='bootscripts']">
461 <xsl:text>
462popd</xsl:text>
463 </xsl:if>
464 <xsl:text>&#xA;</xsl:text>
465 </xsl:template>
466
467 <xsl:template match="para/command">
468 <xsl:variable name="ns" select="normalize-space(string())"/>
469 <xsl:if test="(contains($ns,'test') or
470 contains($ns,'check'))">
471 <xsl:text>#</xsl:text>
472 <xsl:value-of select="substring-before($ns,'make ')"/>
473 <xsl:text>make </xsl:text>
474 <xsl:if test="not(contains($ns,'-k'))">
475 <xsl:text>-k </xsl:text>
476 </xsl:if>
477 <xsl:value-of select="substring-after($ns,'make ')"/>
478 <xsl:text> || true&#xA;</xsl:text>
479 </xsl:if>
480 </xsl:template>
481
482 <xsl:template match="userinput">
483 <xsl:apply-templates/>
484 </xsl:template>
485
486 <xsl:template match="text()" mode="root">
487 <xsl:call-template name="output-root">
488 <xsl:with-param name="out-string" select="string()"/>
489 </xsl:call-template>
490 </xsl:template>
491
492 <xsl:variable name="APOS">'</xsl:variable>
493
494 <xsl:template name="output-root">
495 <xsl:param name="out-string" select="''"/>
496 <xsl:choose>
497 <xsl:when test="contains($out-string,'make ')">
498 <xsl:call-template name="output-root">
499 <xsl:with-param name="out-string"
500 select="substring-before($out-string,'make ')"/>
501 </xsl:call-template>
502 <xsl:text>make -j1 </xsl:text>
503 <xsl:call-template name="output-root">
504 <xsl:with-param name="out-string"
505 select="substring-after($out-string,'make ')"/>
506 </xsl:call-template>
507 </xsl:when>
508 <xsl:when test="contains($out-string,'$') and $sudo = 'y'">
509 <xsl:call-template name="output-root">
510 <xsl:with-param name="out-string"
511 select="substring-before($out-string,'$')"/>
512 </xsl:call-template>
513 <xsl:text>\$</xsl:text>
514 <xsl:call-template name="output-root">
515 <xsl:with-param name="out-string"
516 select="substring-after($out-string,'$')"/>
517 </xsl:call-template>
518 </xsl:when>
519 <xsl:when test="contains($out-string,'`') and $sudo = 'y'">
520 <xsl:call-template name="output-root">
521 <xsl:with-param name="out-string"
522 select="substring-before($out-string,'`')"/>
523 </xsl:call-template>
524 <xsl:text>\`</xsl:text>
525 <xsl:call-template name="output-root">
526 <xsl:with-param name="out-string"
527 select="substring-after($out-string,'`')"/>
528 </xsl:call-template>
529 </xsl:when>
530 <xsl:when test="contains($out-string,'\') and $sudo = 'y'">
531 <xsl:call-template name="output-root">
532 <xsl:with-param name="out-string"
533 select="substring-before($out-string,'\')"/>
534 </xsl:call-template>
535 <xsl:text>\\</xsl:text>
536 <xsl:call-template name="output-root">
537 <xsl:with-param name="out-string"
538 select="substring-after($out-string,'\')"/>
539 </xsl:call-template>
540 </xsl:when>
541 <xsl:when test="contains($out-string,string($APOS))
542 and $wrap-install = 'y'
543 and ancestor::sect2[@role='installation']">
544 <xsl:call-template name="output-root">
545 <xsl:with-param name="out-string"
546 select="substring-before($out-string,string($APOS))"/>
547 </xsl:call-template>
548 <xsl:text>'\''</xsl:text>
549 <xsl:call-template name="output-root">
550 <xsl:with-param name="out-string"
551 select="substring-after($out-string,string($APOS))"/>
552 </xsl:call-template>
553 </xsl:when>
554 <xsl:otherwise>
555 <xsl:value-of select="$out-string"/>
556 </xsl:otherwise>
557 </xsl:choose>
558 </xsl:template>
559
560 <xsl:template match="replaceable">
561 <xsl:text>**EDITME</xsl:text>
562 <xsl:apply-templates/>
563 <xsl:text>EDITME**</xsl:text>
564 </xsl:template>
565
566 <xsl:template match="replaceable" mode="root">
567 <xsl:text>**EDITME</xsl:text>
568 <xsl:apply-templates/>
569 <xsl:text>EDITME**</xsl:text>
570 </xsl:template>
571
572</xsl:stylesheet>
Note: See TracBrowser for help on using the repository browser.