Wydzielenie funkcji guess_mime z VersionedStorage.page_mime, żeby można było ją łatwo...
[redakcja.git] / platforma / static / xsl / wl2html_client.xsl
1 <xsl:stylesheet version="1.0"    
2     xmlns="http://www.w3.org/1999/xhtml"    
3     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
4
5     <!--
6         Dokument ten opisuje jednoznaczne przekształcenie WLML 0.1 -> XHTML.
7     -->        
8     <xsl:output method="xml" encoding="utf-8" indent="no" omit-xml-declaration="yes" />
9
10     <xsl:template match="/">
11         <xsl:apply-templates select="chunk|utwor" />
12     </xsl:template>
13
14     <!--
15         Base tag for rendering a fragment of text
16     -->
17     <xsl:template match="chunk">        
18         <xsl:apply-templates select="child::node()">            
19             <xsl:with-param name="mixed" select="true()" />
20         </xsl:apply-templates>        
21     </xsl:template>
22     
23     <!--
24         Base tag for rendering the whole text 
25     -->
26
27     <xsl:template match="utwor">
28         <div>
29             <xsl:call-template name="standard-attributes" />
30             <xsl:apply-templates select="child::*">
31                 <xsl:with-param name="mixed" select="false()" />
32             </xsl:apply-templates>
33         </div>
34     </xsl:template>    
35     
36     <!-- 
37         Przekształcenia poszczególnych elementów zgodnie z:            
38         http://wiki.wolnepodreczniki.pl/Lektury:Sk%C5%82ad/Tagi_sk%C5%82adu
39     -->
40
41     <!-- TAGI MASTERÓW STYLÓW
42     
43         Tagi rozpoczynające i kończące tekst utworu lirycznego o standardowej szerokości łamu:
44     -->
45
46     <xsl:template match="opowiadanie|powiesc">
47         <xsl:param name="mixed" />
48         <div>
49             <xsl:call-template name="standard-attributes" />
50             <xsl:apply-templates select="child::node()">
51                 <xsl:with-param name="mixed" select="false()" />
52             </xsl:apply-templates>
53         </div>
54     </xsl:template>
55
56     <xsl:template match="liryka_l|liryka_lp">
57         <xsl:param name="mixed" />
58         <div>
59             <xsl:call-template name="standard-attributes" />
60             <xsl:apply-templates select="child::node()">
61                 <xsl:with-param name="mixed" select="false()" />
62             </xsl:apply-templates>
63         </div>
64     </xsl:template>
65
66     <xsl:template match="dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny">
67         <xsl:param name="mixed" />
68         <div>
69             <xsl:call-template name="standard-attributes" />
70             <xsl:apply-templates select="child::node()">
71                 <xsl:with-param name="mixed" select="false()" />
72             </xsl:apply-templates>
73         </div>
74     </xsl:template>
75
76     <xsl:template match="wywiad">
77         <xsl:param name="mixed" />
78         <div>
79             <xsl:call-template name="standard-attributes" />
80             <xsl:apply-templates select="child::node()">
81                 <xsl:with-param name="mixed" select="false()" />
82             </xsl:apply-templates>
83         </div>
84     </xsl:template>
85
86     <!-- 
87         *****************************
88         ELEMENTY POZA TEKSTEM GŁÓWNYM
89         *****************************
90     -->
91
92     <!--
93         Autor składanego utworu
94
95         Element strony tytułowej - lub odpowiadającej jej przestrzeni,
96         np. na stronie internetowej) :
97
98         <autor_utworu> imiona-itd.-autora-składanego-utworu </autor_utworu>
99     -->
100     <xsl:template match="autor_utworu">
101         <xsl:param name="mixed" />
102         <h2 x-editable="true">
103             <xsl:call-template name="standard-attributes" />
104             <xsl:call-template name="context-menu" />
105             <xsl:apply-templates select="child::node()">
106                 <xsl:with-param name="mixed" select="true()" />
107             </xsl:apply-templates>
108         </h2>
109     </xsl:template>
110
111     <!-- 
112         Nazwa składanego utworu
113
114         Element strony tytułowej - lub odpowiadającej jej przestrzeni,
115         np. na stronie internetowej
116
117         <nazwa_utworu> tytuł-składanego-utworu </nazwa_utworu>
118     -->
119     <xsl:template match="nazwa_utworu">
120         <xsl:param name="mixed" />
121         <h1 x-editable="true">
122             <xsl:call-template name="standard-attributes" />
123             <xsl:call-template name="context-menu" />
124             <xsl:apply-templates select="child::node()">
125                 <xsl:with-param name="mixed" select="true()" />
126             </xsl:apply-templates>
127         </h1>
128     </xsl:template>
129
130     <!--
131         Nazwa utworu nadrzędnego, w którego skład wchodzi dany utwór
132         <dzielo_nadrzedne> tytuł-dzieła-nadrzędnego </dzielo_nadrzedne>
133
134          Przykład:
135
136          <utwor>
137          <liryka_l>
138             <autor_utworu>Bruno Jasieński</autor_utworu>
139             <dzielo_nadrzedne>But w butonierce</dzielo_nadrzedne>
140             <nazwa_utworu>Deszcz</nazwa_utworu>
141             ....
142     -->
143     <xsl:template match="dzielo_nadrzedne">
144         <xsl:param name="mixed" />
145         <h2 x-editable="true">
146             <xsl:call-template name="standard-attributes" />
147             <xsl:call-template name="context-menu" />
148             <xsl:apply-templates select="child::node()">
149                 <xsl:with-param name="mixed" select="true()" />
150             </xsl:apply-templates>
151         </h2>
152     </xsl:template>
153
154     <!--
155         Podtytuł, czyli wszystkie dopiski do tytułu
156
157         Element strony tytułowej - lub odpowiadającej jej przestrzeni.
158         <podtytul> podtytuł-składanego-utworu </podtytul>
159
160         Przykład:
161         <utwor>
162             <powiesc>
163             <autor_utworu>Daniel Defoe</autor_utworu>
164             <nazwa_utworu>Robinson Crusoe</nazwa_utworu>
165             <podtytul>Jego życia losy, doświadczenia i przypadki</podtytul>
166             ...
167     -->
168     <xsl:template match="podtytul">
169         <xsl:param name="mixed" />
170         <h3 x-editable="true">
171             <xsl:call-template name="standard-attributes" />
172             <xsl:call-template name="context-menu" />
173             <xsl:apply-templates select="child::node()">
174                 <xsl:with-param name="mixed" select="true()" />
175             </xsl:apply-templates>
176         </h3>
177     </xsl:template>
178
179     <!--
180        Tagi obejmujące tekst noty poprzedzającej tekst główny (styl wieloakapitowy):
181
182         <nota><akap> tekst-noty </akap></nota> (styl wieloakapitowy)
183     -->
184
185     <xsl:template match="nota">
186         <xsl:param name="mixed" />
187         <div>
188             <xsl:call-template name="standard-attributes" />
189             <xsl:apply-templates select="child::node()">
190                 <xsl:with-param name="mixed" select="false()" />
191             </xsl:apply-templates>
192         </div>
193     </xsl:template>
194
195     <!--
196         Tagi obejmujące tekst dedykacji (styl wieloakapitowy bądź wielostrofowy):
197         <dedykacja> tekst-dedykacji </dedykacja>
198     -->
199     <xsl:template match="dedykacja">
200         <xsl:param name="mixed" />
201         <div>
202             <xsl:call-template name="standard-attributes" />
203             <xsl:apply-templates select="child::node()">
204                 <xsl:with-param name="mixed" select="false()" />
205             </xsl:apply-templates>
206         </div>
207     </xsl:template>
208
209     <!--
210         Tagi obejmujące tekst motta (styl wieloakapitowy bądź wielostrofowy):
211         <motto> tekst-motta </motto>
212     -->
213     <xsl:template match="motto">
214         <xsl:param name="mixed" />
215         <div>
216             <xsl:call-template name="standard-attributes" />
217             <xsl:apply-templates select="child::node()">
218                 <xsl:with-param name="mixed" select="true()" />
219             </xsl:apply-templates>
220         </div>
221     </xsl:template>
222
223     <xsl:template match="motto_podpis">
224         <xsl:param name="mixed" />
225         <p x-editable="true">
226             <xsl:call-template name="standard-attributes" />
227             <xsl:call-template name="context-menu" />
228             <xsl:apply-templates select="child::node()">
229                 <xsl:with-param name="mixed" select="true()" />
230             </xsl:apply-templates>
231         </p>
232     </xsl:template>
233
234     <!--
235         Tagi obejmujące listę osób poprzedzającą tekst dramatu
236           (zwykle składaną na osobnej stronie; to odmiana stylu listy):
237
238         <lista_osob> osoby </lista_osob>
239     -->
240     <xsl:template match="lista_osob">
241         <xsl:param name="mixed" />
242         <div>
243             <xsl:call-template name="standard-attributes" />
244             <xsl:apply-templates select="child::node()">
245                 <xsl:with-param name="mixed" select="false()" />
246             </xsl:apply-templates>
247         </div>
248     </xsl:template>
249
250     <xsl:template match="naglowek_listy">
251         <xsl:param name="mixed" />
252         <p x-editable="true">
253             <xsl:call-template name="standard-attributes" />
254             <xsl:call-template name="context-menu" />
255             <xsl:apply-templates select="child::node()">
256                 <xsl:with-param name="mixed" select="true()" />
257             </xsl:apply-templates>
258         </p>
259     </xsl:template>
260
261     <xsl:template match="lista_osoba">
262         <xsl:param name="mixed" />
263         <p x-editable="true">
264             <xsl:call-template name="standard-attributes" />
265             <xsl:call-template name="context-menu" />
266             <xsl:apply-templates select="child::node()">
267                 <xsl:with-param name="mixed" select="true()" />
268             </xsl:apply-templates>
269         </p>
270     </xsl:template>
271
272     <!--  Tagi obejmujące inne komentarze wprowadzające
273         przed tekstem dramatu (składane razem z listą osób):
274
275         <miejsce_czas> komentarze-wprowadzające </miejsce_czas>
276     -->
277     <xsl:template match="miejsce_czas">
278         <xsl:param name="mixed" />
279         <p x-editable="true">
280             <xsl:call-template name="standard-attributes" />
281             <xsl:call-template name="context-menu" />
282             <xsl:apply-templates select="child::node()">
283                 <xsl:with-param name="mixed" select="true()" />
284             </xsl:apply-templates>
285         </p>
286     </xsl:template>
287
288
289     <!--
290         ***************************
291         TAGI STYLÓW TEKSTU GŁÓWNEGO
292         ***************************
293     -->
294
295     <!--
296       Tagi nagłówka części/księgi:
297       <naglowek_czesc> nagłówek-części-lub-księgi </naglowek_czesc>
298     -->
299     <xsl:template match="naglowek_czesc">
300         <xsl:param name="mixed" />
301         <h2 x-editable="true">
302             <xsl:call-template name="standard-attributes" />
303             <xsl:call-template name="context-menu" />
304             <xsl:apply-templates select="child::node()">
305                 <xsl:with-param name="mixed" select="true()" />
306             </xsl:apply-templates>
307         </h2>
308     </xsl:template>
309
310     <!--
311       Tagi tytułu rozdziału:
312       <naglowek_rozdzial> nr-i/lub-tytuł </naglowek_rozdzial>
313     -->
314     <xsl:template match="naglowek_rozdzial">
315         <xsl:param name="mixed" />
316         <h3 x-editable="true">
317             <xsl:call-template name="standard-attributes" />
318             <xsl:call-template name="context-menu" />
319             <xsl:apply-templates select="child::node()">
320                 <xsl:with-param name="mixed" select="true()" />
321             </xsl:apply-templates>
322         </h3>
323     </xsl:template>
324
325     <!--
326       Tagi tytułu podrozdziału:
327       <naglowek_podrozdzial> nr-i/lub-podtytuł </naglowek_podrozdzial>
328     -->
329     <xsl:template match="naglowek_podrozdzial">
330         <xsl:param name="mixed" />
331         <h4 x-editable="true">
332             <xsl:call-template name="standard-attributes" />
333             <xsl:call-template name="context-menu" />
334             <xsl:apply-templates select="child::node()">
335                 <xsl:with-param name="mixed" select="true()" />
336             </xsl:apply-templates>
337         </h4>
338     </xsl:template>
339
340     <!--
341        Tagi sródtytułu:
342        <srodtytul> śródtytuł </srodtytul>
343
344        Tagi nagłówków aktów:
345        <naglowek_akt> nagłówek-aktu </naglowek_akt>
346     -->
347
348     <xsl:template match="srodtytul">
349         <xsl:param name="mixed" />
350         <h2 x-editable="true">
351             <xsl:call-template name="standard-attributes" />
352             <xsl:call-template name="context-menu" />
353             <xsl:apply-templates select="child::node()">
354                 <xsl:with-param name="mixed" select="true()" />
355             </xsl:apply-templates>
356         </h2>
357     </xsl:template>
358
359     <xsl:template match="naglowek_akt">
360         <xsl:param name="mixed" />
361         <h2 x-editable="true">
362             <xsl:call-template name="standard-attributes" />
363             <xsl:call-template name="context-menu" />
364             <xsl:apply-templates select="child::node()">
365                 <xsl:with-param name="mixed" select="true()" />
366             </xsl:apply-templates>
367         </h2>
368     </xsl:template>
369
370     <!--
371       Tagi nagłówków scen:
372       <naglowek_scena> nagłówek-sceny </naglowek_scena>
373     -->
374
375     <xsl:template match="naglowek_scena">
376         <xsl:param name="mixed" />
377         <h3 x-editable="true">
378             <xsl:call-template name="standard-attributes" />
379             <xsl:call-template name="context-menu" />
380             <xsl:apply-templates select="child::node()">
381                 <xsl:with-param name="mixed" select="true()" />
382             </xsl:apply-templates>
383         </h3>
384     </xsl:template>
385     
386     <xsl:template match="naglowek_osoba">
387         <xsl:param name="mixed" />
388         <h4 x-editable="true">
389             <xsl:call-template name="standard-attributes" />
390             <xsl:call-template name="context-menu" />
391             <xsl:apply-templates select="child::node()">
392                 <xsl:with-param name="mixed" select="true()" />
393             </xsl:apply-templates>
394         </h4>
395     </xsl:template>
396
397     <!--
398        ************************
399        Bloki w tekście głównym
400        ************************
401     -->
402     
403     <xsl:template match="dlugi_cytat">
404         <xsl:param name="mixed" />
405         <div>
406             <xsl:call-template name="standard-attributes" />
407             <xsl:apply-templates select="child::node()">
408                 <xsl:with-param name="mixed" select="false()" />
409             </xsl:apply-templates>
410         </div>
411     </xsl:template>
412     
413     <xsl:template match="poezja_cyt">
414         <xsl:param name="mixed" />
415         <div>
416             <xsl:call-template name="standard-attributes" />
417             <xsl:apply-templates select="child::node()">
418                 <xsl:with-param name="mixed" select="false()" />
419             </xsl:apply-templates>
420         </div>
421     </xsl:template>
422
423     <xsl:template match="kwestia">
424         <xsl:param name="mixed" />
425         <div>
426             <xsl:call-template name="standard-attributes" />
427             <xsl:apply-templates select="child::node()">
428                 <xsl:with-param name="mixed" select="false()" />
429             </xsl:apply-templates>
430         </div>
431     </xsl:template>
432
433     <xsl:template match="didaskalia">
434         <xsl:param name="mixed" />
435         <div>
436             <xsl:call-template name="standard-attributes" />
437             <xsl:apply-templates select="child::node()">
438                 <xsl:with-param name="mixed" select="true()" />
439             </xsl:apply-templates>
440         </div>
441     </xsl:template>
442
443     <xsl:template match="wywiad_pyt">
444         <xsl:param name="mixed" />
445         <div>
446             <xsl:call-template name="standard-attributes" />
447             <xsl:apply-templates select="child::node()">
448                 <xsl:with-param name="mixed" select="false()" />
449             </xsl:apply-templates>
450         </div>
451     </xsl:template>
452
453     <xsl:template match="wywiad_odp">
454         <xsl:param name="mixed" />
455         <div>
456             <xsl:call-template name="standard-attributes" />
457             <xsl:apply-templates select="child::node()">
458                 <xsl:with-param name="mixed" select="false()" />
459             </xsl:apply-templates>
460         </div>
461     </xsl:template>
462
463     <!--
464         ***********************************
465         Style akapitowe oraz strofy i wersy
466         ***********************************
467     -->
468
469     <xsl:template match="akap">
470         <xsl:param name="mixed" />
471         <p x-editable="true">
472             <xsl:call-template name="standard-attributes" />
473             <xsl:call-template name="context-menu" />
474             <xsl:apply-templates select="child::node()">
475                 <xsl:with-param name="mixed" select="true()" />
476             </xsl:apply-templates>
477         </p>
478     </xsl:template>
479
480     <xsl:template match="akap_cd">
481         <xsl:param name="mixed" />
482         <p x-editable="true">
483             <xsl:call-template name="standard-attributes" />
484             <xsl:call-template name="context-menu" />
485             <xsl:apply-templates select="child::node()">
486                 <xsl:with-param name="mixed" select="true()" />
487             </xsl:apply-templates>
488         </p>
489     </xsl:template>
490
491     <xsl:template match="akap_dialog">
492         <xsl:param name="mixed" />
493         <p x-editable="true">
494             <xsl:call-template name="standard-attributes" />
495             <xsl:call-template name="context-menu" />
496             <xsl:apply-templates select="child::node()">
497                 <xsl:with-param name="mixed" select="true()" />
498             </xsl:apply-templates>
499         </p>
500     </xsl:template>
501
502     <!--
503         ********
504         STROFA
505         ********
506     -->
507     <xsl:template match="strofa">
508         <div x-editable="true">
509             <xsl:call-template name="standard-attributes" />
510             <xsl:call-template name="context-menu" />
511          
512             <xsl:choose>
513                 <xsl:when test="count(br) > 0">
514                     <xsl:variable name="first-verse" select="br[1]/preceding-sibling::node()" />                    
515                     <xsl:call-template name="verse">
516                         <xsl:with-param name="verse-content" select="$first-verse" />                        
517                     </xsl:call-template>
518                     <xsl:for-each select="br">
519                         <xsl:variable name="lnum" select="count(preceding-sibling::br)" />
520                         <!-- select all nodes up to the next br or end of stanza -->
521                         <xsl:variable name="current-verse"
522                             select="following-sibling::node()[count(preceding-sibling::br) = $lnum+1]" />                        
523                         <xsl:call-template name="verse">
524                             <xsl:with-param name="verse-content" select="$current-verse" />                            
525                         </xsl:call-template>
526                     </xsl:for-each>
527                 </xsl:when>
528                 <xsl:otherwise>
529                     <xsl:call-template name="verse">
530                         <xsl:with-param name="verse-content" select="child::node()" />                        
531                     </xsl:call-template>
532                 </xsl:otherwise>
533             </xsl:choose>
534         </div>
535     </xsl:template>
536
537     <xsl:template name="verse">
538         <!-- the verse contents including the last br (if any) -->
539         <xsl:param name="verse-content" />
540         <xsl:variable name="first-tag-name" select="name($verse-content/self::*)" />
541         <!-- name of text nodes is '' == false -->
542
543         <!-- THIS IS A HORROR!!! -->
544         <!-- Possible variants: -->
545         <xsl:choose>
546             <!-- Simple verse == not wers_ tags anywhere until the ending br -->
547             <xsl:when test="not($verse-content[starts-with(name(), 'wers_')])">
548                 <p class="wers" x-node="wers">
549                 <xsl:apply-templates select="$verse-content[local-name(.) != 'br']">
550                     <xsl:with-param name="mixed" select="true()" />
551                 </xsl:apply-templates>
552                 </p>
553             </xsl:when>
554
555             <xsl:otherwise>
556             <xsl:apply-templates select="$verse-content[local-name(.) != 'br']">
557                 <xsl:with-param name="mixed" select="false()" />
558             </xsl:apply-templates>
559             </xsl:otherwise>
560         </xsl:choose>
561     </xsl:template>
562
563     <xsl:template match="wers_cd|wers_akap|wers_wciety">
564         <xsl:param name="mixed" />
565         <p>
566             <xsl:call-template name="standard-attributes" />
567             <xsl:apply-templates select="child::node()">
568                 <xsl:with-param name="mixed" select="true()" />
569             </xsl:apply-templates>
570         </p>
571     </xsl:template>
572
573     <xsl:template match="br"><xsl:text>/</xsl:text></xsl:template>
574
575
576     <!--
577         *************
578         STYLE ZNAKOWE
579         *************
580     -->
581
582     <!--
583         Tagi obejmujące tytuł dzieła, np. książki, filmu, piosenki,
584         modlitwy, przedstawienia teatr. itd.:
585
586         <tytul_dziela> tytuł-dzieła </tytul_dziela>
587     -->
588     <xsl:template match="tytul_dziela">
589         <xsl:param name="mixed" />
590         <em>
591             <xsl:call-template name="standard-attributes" />
592             <xsl:apply-templates select="child::node()">
593                 <xsl:with-param name="mixed" select="true()" />
594             </xsl:apply-templates>
595         </em>
596     </xsl:template>
597
598     <xsl:template match="wyroznienie|slowo_obce|mat|didask_tekst|osoba|wyp_osoba|www">
599         <xsl:param name="mixed" />
600         <em>
601             <xsl:call-template name="standard-attributes" />
602             <xsl:apply-templates select="child::node()">
603                 <xsl:with-param name="mixed" select="true()" />
604             </xsl:apply-templates>
605         </em>
606     </xsl:template>
607
608     <!--
609         **********
610         SEPARATORY
611         **********
612     -->
613     <xsl:template match="sekcja_swiatlo">
614         <xsl:param name="mixed" />
615         <br><xsl:call-template name="standard-attributes" /></br>
616     </xsl:template>
617
618     <xsl:template match="sekcja_asterysk">
619         <xsl:param name="mixed" />
620         <hr><xsl:call-template name="standard-attributes" /></hr>
621     </xsl:template>
622
623     <xsl:template match="separator_linia">
624         <xsl:param name="mixed" />
625         <hr><xsl:call-template name="standard-attributes" /></hr>
626     </xsl:template>
627
628     <xsl:template match="zastepnik_wersu">
629         <xsl:param name="mixed" />
630         <hr><xsl:call-template name="standard-attributes" /></hr>
631     </xsl:template>
632
633     <!--
634         *************
635            PRZYPISY
636         *************
637     -->
638
639     <!--
640         Przypisy i motywy
641     -->
642     <xsl:template match="pr|pa|pe|pt">       
643         <span x-editable="true">
644             <xsl:call-template name="standard-attributes">
645                 <xsl:with-param name="extra-class" select="'annotation-inline-box'" />
646             </xsl:call-template>
647             <a name="anchor-{generate-id(.)}" />
648             <!-- the link to the non-inline version -->
649             <a href="#annotation-{generate-id(.)}" class="annotation"></a>
650             <!-- inline contents -->
651             <span x-annotation-box="true">
652                 <xsl:call-template name="context-menu" />
653                 <xsl:apply-templates select="node()">
654                     <xsl:with-param name="mixed" select="true()" />
655                 </xsl:apply-templates>
656             </span>
657         </span>
658     </xsl:template>
659
660     <xsl:template match="begin">        
661         <span>
662             <xsl:call-template name="standard-attributes" />
663             <xsl:attribute name="theme-class">
664                 <xsl:value-of select="substring-after(@id, 'b')" />
665             </xsl:attribute>
666         </span>
667     </xsl:template>
668
669     <xsl:template match="extra|uwaga">
670         <span>
671             <xsl:call-template name="standard-attributes" />
672             <xsl:apply-templates select="node()" />
673         </span>
674     </xsl:template>
675
676     <xsl:template match="motyw">
677         <span x-editable="true">
678             <xsl:call-template name="standard-attributes" />
679             <xsl:attribute name="theme-class">
680                 <xsl:value-of select="substring-after(@id, 'm')" />
681             </xsl:attribute>
682             <xsl:call-template name="context-menu" />
683             <span class="theme-text-list"><xsl:value-of select="." /></span>
684         </span>
685     </xsl:template>
686
687     <xsl:template match="end">
688         <span>
689             <xsl:call-template name="standard-attributes" />
690             <xsl:attribute name="theme-class">
691                 <xsl:value-of select="substring-after(@id, 'e')" />
692             </xsl:attribute>
693         </span>
694     </xsl:template>
695
696
697     <!--
698         ****************
699          TEKST WŁAŚCIWY
700         ****************
701     -->
702
703     <xsl:template match="text()">
704         <xsl:param name="mixed" />
705         <xsl:choose>
706             <xsl:when test="normalize-space(.) = ''" />
707             <xsl:when test="not($mixed)"><span x-node="out-of-flow-text" class="out-of-flow-text"
708                     x-content="{.}"></span></xsl:when>
709             <xsl:otherwise><xsl:value-of select="." /></xsl:otherwise>
710         </xsl:choose>
711     </xsl:template>
712
713     <xsl:template match="comment()">
714         <xsl:comment><xsl:value-of select="." /></xsl:comment>
715     </xsl:template>
716
717     <xsl:template match="*[name() != local-name()]">
718         <div>
719             <xsl:call-template name="standard-attributes" />
720             <xsl:apply-templates select="child::node()">
721                 <xsl:with-param name="mixed" select="true()" />
722             </xsl:apply-templates>
723         </div>
724     </xsl:template>
725
726     <xsl:template match="*">
727         <error>Unknown tag: <xsl:value-of select="name()" /></error>
728     </xsl:template>
729
730     <xsl:template name="context-menu">
731         <span class="default-menu context-menu">
732             <span class="edit-button">Edit</span>
733             <span class="delete-button">Delete</span>
734         </span>
735         <span class="edit-menu context-menu">
736             <span class="accept-button">Accept</span>
737             <span class="reject-button">Close</span>
738         </span>
739     </xsl:template>
740
741     <xsl:template name="standard-attributes">
742         <xsl:param name="extra-class" />
743         <xsl:attribute name="class"><xsl:value-of select="local-name()" /><xsl:text>&#x0020;</xsl:text><xsl:value-of select="$extra-class" /></xsl:attribute>
744
745         <!-- we use upper-case attribute names, so we don't have to wory about HTML parsers -->
746         <xsl:attribute name="x-node"><xsl:value-of select="name()" /></xsl:attribute>
747
748         <xsl:if test="local-name() != name()">
749             <xsl:attribute name="x-ns"><xsl:value-of select="namespace-uri()" /></xsl:attribute>
750         </xsl:if>
751
752         <xsl:for-each select="@*">
753             <xsl:variable name="id" select="generate-id()" />
754             <xsl:attribute name="x-attr-value-{$id}"><xsl:value-of select="."/></xsl:attribute>
755             <xsl:attribute name="x-attr-qname-{$id}"><xsl:value-of select="name()"/></xsl:attribute>
756             <xsl:if test="namespace-uri()">
757                 <xsl:attribute name="x-attr-ns-{$id}"><xsl:value-of select="namespace-uri()"/></xsl:attribute>
758             </xsl:if>               
759         </xsl:for-each>
760     </xsl:template>
761     
762 </xsl:stylesheet>