]> matita.cs.unibo.it Git - helm.git/blob - helm/DEVEL/mathml_editor/xsl/tml-mmlp.xsl
* this is a large commit
[helm.git] / helm / DEVEL / mathml_editor / xsl / tml-mmlp.xsl
1 <?xml version="1.0"?>
2 <xsl:stylesheet
3      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
4      xmlns:tml="http://helm.cs.unibo.it/2002/TML"
5      xmlns:m="http://www.w3.org/1998/Math/MathML"
6      version="1.0">
7
8   <xsl:output indent="yes"/>
9
10   <xsl:param name="id" select="/.."/>
11
12   <xsl:template match="/">
13     <xsl:choose>
14       <xsl:when test="$id">
15         <xsl:apply-templates select="descendant::*[@id=$id]"/>
16       </xsl:when>
17       <xsl:otherwise>
18         <xsl:apply-templates/>
19       </xsl:otherwise>
20     </xsl:choose>
21   </xsl:template>
22
23   <xsl:template match="tml:math">
24     <m:math>
25       <xsl:if test="@id">
26         <xsl:attribute name="xref">
27           <xsl:value-of select="@id"/>
28         </xsl:attribute>
29       </xsl:if>
30        <xsl:if test="@display='1'">
31         <xsl:attribute name="display">block</xsl:attribute>
32       </xsl:if>
33       <xsl:attribute name="display">block</xsl:attribute>
34       <xsl:apply-templates select="*"/>
35     </m:math>
36   </xsl:template>
37
38   <xsl:template match="tml:i">
39     <m:mi>
40       <xsl:if test="@id">
41         <xsl:attribute name="xref">
42           <xsl:value-of select="@id"/>
43         </xsl:attribute>
44       </xsl:if>
45       <xsl:value-of select="@val"/>
46     </m:mi>
47   </xsl:template>
48
49   <xsl:template match="tml:n">
50     <m:mn>
51       <xsl:if test="@id">
52         <xsl:attribute name="xref">
53           <xsl:value-of select="@id"/>
54         </xsl:attribute>
55       </xsl:if>
56       <xsl:value-of select="@val"/>
57     </m:mn>
58   </xsl:template>
59
60   <xsl:template match="tml:o">
61     <m:mo>
62       <xsl:if test="@id">
63         <xsl:attribute name="xref">
64           <xsl:value-of select="@id"/>
65         </xsl:attribute>
66       </xsl:if>
67       <xsl:value-of select="@val"/>
68     </m:mo>
69   </xsl:template>
70
71   <xsl:template name="cursor">
72     <xsl:choose>
73       <xsl:when test="substring(@val,1,1)='\'">
74         <m:mrow>
75           <xsl:if test="@id">
76             <xsl:attribute name="xref">
77               <xsl:value-of select="@id"/>
78             </xsl:attribute>
79           </xsl:if>
80           <m:mo stretchy="false">&#x2329;</m:mo>
81           <m:mtext mathcolor="blue"><xsl:value-of select="@val"/></m:mtext>
82           <m:mo stretchy="false">&#x232a;</m:mo>
83         </m:mrow>
84       </xsl:when>
85       <xsl:otherwise>
86         <m:mtext mathcolor="blue">
87          <xsl:if test="@id">
88            <xsl:attribute name="xref">
89              <xsl:value-of select="@id"/>
90            </xsl:attribute>
91          </xsl:if>I</m:mtext>
92       </xsl:otherwise>
93     </xsl:choose>
94   </xsl:template>
95
96   <xsl:template match="tml:cursor">
97     <xsl:param name="annotation" select="/.."/>
98     <xsl:choose>
99       <xsl:when test="$annotation">
100         <m:msub>
101           <xsl:call-template name="cursor"/>
102           <m:mtext>
103             <xsl:value-of select="$annotation"/>
104           </m:mtext>
105         </m:msub>
106       </xsl:when>
107       <xsl:otherwise>
108         <xsl:call-template name="cursor"/>
109       </xsl:otherwise>
110     </xsl:choose>
111   </xsl:template>
112
113   <xsl:template match="tml:sb[@under='1'][*[1]/tml:sp[@over='1']]">
114     <m:munderover>
115       <xsl:if test="@id">
116         <xsl:attribute name="xref">
117           <xsl:value-of select="@id"/>
118         </xsl:attribute>
119       </xsl:if>
120       <xsl:apply-templates select="*[1]/*[1]"/>
121       <xsl:apply-templates select="*[2]"/>
122       <xsl:apply-templates select="*[1]/*[2]"/>
123     </m:munderover>
124   </xsl:template>
125
126   <xsl:template match="tml:sb[@under='1']">
127     <m:munder>
128       <xsl:if test="@id">
129         <xsl:attribute name="xref">
130           <xsl:value-of select="@id"/>
131         </xsl:attribute>
132       </xsl:if>
133       <xsl:apply-templates select="*[1]"/>
134       <xsl:apply-templates select="*[2]"/>
135     </m:munder>
136   </xsl:template>
137
138   <xsl:template match="tml:sb[*[1][self::tml:sp[not(@over) or @over='0']]]">
139     <m:msubsup>
140       <xsl:if test="@id">
141         <xsl:attribute name="xref">
142           <xsl:value-of select="@id"/>
143         </xsl:attribute>
144       </xsl:if>
145       <xsl:apply-templates select="*[1]/*[1]"/>
146       <xsl:apply-templates select="*[2]"/>
147       <xsl:apply-templates select="*[1]/*[2]"/>
148     </m:msubsup>
149   </xsl:template>
150
151   <xsl:template match="tml:sb">
152     <m:msub>
153       <xsl:if test="@id">
154         <xsl:attribute name="xref">
155           <xsl:value-of select="@id"/>
156         </xsl:attribute>
157       </xsl:if>
158       <xsl:apply-templates select="*[1]"/>
159       <xsl:apply-templates select="*[2]"/>
160     </m:msub>
161   </xsl:template>
162
163   <xsl:template match="tml:sp[@over='1'][*[1]/tml:sb[@under='1']]">
164     <m:munderover>
165       <xsl:if test="@id">
166         <xsl:attribute name="xref">
167           <xsl:value-of select="@id"/>
168         </xsl:attribute>
169       </xsl:if>
170       <xsl:apply-templates select="*[1]/*[1]"/>
171       <xsl:apply-templates select="*[1]/*[2]"/>
172       <xsl:apply-templates select="*[2]"/>
173     </m:munderover>
174   </xsl:template>
175
176   <xsl:template match="tml:sp[@over='1']">
177     <m:mover>
178       <xsl:if test="@id">
179         <xsl:attribute name="xref">
180           <xsl:value-of select="@id"/>
181         </xsl:attribute>
182       </xsl:if>
183       <xsl:apply-templates select="*[1]"/>
184       <xsl:apply-templates select="*[2]"/>
185     </m:mover>
186   </xsl:template>
187
188   <xsl:template match="tml:sp[*[1][self::tml:sb[not(@over) or @over='0']]]">
189     <m:msubsup>
190       <xsl:if test="@id">
191         <xsl:attribute name="xref">
192           <xsl:value-of select="@id"/>
193         </xsl:attribute>
194       </xsl:if>
195       <xsl:apply-templates select="*[1]/*[1]"/>
196       <xsl:apply-templates select="*[1]/*[2]"/>
197       <xsl:apply-templates select="*[2]"/>
198     </m:msubsup>
199   </xsl:template>
200
201   <xsl:template match="tml:sp">
202     <m:msup>
203       <xsl:if test="@id">
204         <xsl:attribute name="xref">
205           <xsl:value-of select="@id"/>
206         </xsl:attribute>
207       </xsl:if>
208       <xsl:apply-templates select="*[1]"/>
209       <xsl:apply-templates select="*[2]"/>
210     </m:msup>
211   </xsl:template>
212
213   <xsl:template match="tml:g">
214     <xsl:param name="annotation" select="/.."/>
215     <xsl:choose>
216       <xsl:when test="not(@id) and count(*) = 1">
217         <xsl:apply-templates select="*[1]">
218           <xsl:with-param name="annotation" select="$annotation"/>
219         </xsl:apply-templates>
220       </xsl:when>
221       <xsl:when test="tml:cursor">
222         <m:mstyle mathbackground="#e0e0e0">
223           <xsl:if test="@id">
224             <xsl:attribute name="xref">
225               <xsl:value-of select="@id"/>
226             </xsl:attribute>
227           </xsl:if>
228           <m:mrow>
229             <xsl:apply-templates select="*">
230               <xsl:with-param name="annotation" select="$annotation"/>
231             </xsl:apply-templates>
232           </m:mrow>
233         </m:mstyle>
234       </xsl:when>
235        <xsl:otherwise>
236         <m:mrow>
237           <xsl:if test="@id">
238             <xsl:attribute name="xref">
239               <xsl:value-of select="@id"/>
240             </xsl:attribute>
241           </xsl:if>
242           <xsl:apply-templates select="*">
243             <xsl:with-param name="annotation" select="$annotation"/>
244           </xsl:apply-templates>
245         </m:mrow>
246       </xsl:otherwise>
247     </xsl:choose>
248   </xsl:template>
249
250   <xsl:template match="tml:row">
251     <m:mtr>
252       <xsl:apply-templates select="cell"/>
253     </m:mtr>
254   </xsl:template>
255
256   <xsl:template match="tml:cell">
257     <m:mtd>
258       <xsl:apply-templates select="*"/>
259     </m:mtd>
260   </xsl:template>
261
262 <!--/// CONTROL SEQUENCES ///-->
263
264   <xsl:template match="tml:c">
265     <m:mrow>
266       <xsl:if test="@id">
267         <xsl:attribute name="xref">
268           <xsl:value-of select="@id"/>
269         </xsl:attribute>
270       </xsl:if>
271       <m:mtext mathcolor="blue">\<xsl:value-of select="@name"/></m:mtext>
272       <xsl:apply-templates select="*"/>
273     </m:mrow>
274   </xsl:template>
275
276   <xsl:template match="tml:c[@name='fun' and count(*)=3]">
277     <m:mrow>
278       <xsl:if test="@id">
279         <xsl:attribute name="xref">
280           <xsl:value-of select="@id"/>
281         </xsl:attribute>
282       </xsl:if>
283       <m:mo mathcolor="red">&#x03bb;</m:mo>
284       <xsl:apply-templates select="*[1]"/>
285       <m:mo>:</m:mo>
286       <xsl:apply-templates select="*[2]"/>
287       <m:mo>.</m:mo>
288       <xsl:apply-templates select="*[3]"/>
289     </m:mrow>
290   </xsl:template>
291
292   <xsl:template match="tml:c[@name='not'][*[1][self::tml:o]]">
293 <!-- not -->
294     <m:mo>
295       <xsl:if test="@id">
296         <xsl:attribute name="xref">
297           <xsl:value-of select="@id"/>
298         </xsl:attribute>
299       </xsl:if>
300       <xsl:value-of select="*[1]/@val"/>&#x0338;</m:mo>
301   </xsl:template>
302
303   <xsl:template match="tml:c[@name='buildrel']">
304 <!-- buildrel -->
305     <m:mover>
306       <xsl:if test="@id">
307         <xsl:attribute name="xref">
308           <xsl:value-of select="@id"/>
309         </xsl:attribute>
310       </xsl:if>
311       <xsl:apply-templates select="*[2]"/>
312       <xsl:apply-templates select="*[1]"/>
313     </m:mover>
314   </xsl:template>
315
316   <xsl:template match="tml:c[@name='left' or @name='right'][*[1][self::tml:o]]">
317 <!-- left -->
318     <m:mo stretchy="true">
319       <xsl:if test="@id">
320         <xsl:attribute name="xref">
321           <xsl:value-of select="@id"/>
322         </xsl:attribute>
323       </xsl:if>
324       <xsl:value-of select="*[1]/@val"/>
325     </m:mo>
326   </xsl:template>
327
328   <xsl:template match="tml:c[@name='bigl' or @name='bigr' or @name='bigm' or @name='big'][*[1][self::tml:o]]">
329 <!-- bigl -->
330     <m:mo stretchy="true" minsize="8.5pt">
331       <xsl:if test="@id">
332         <xsl:attribute name="xref">
333           <xsl:value-of select="@id"/>
334         </xsl:attribute>
335       </xsl:if>
336       <xsl:value-of select="*[1]/@val"/>
337     </m:mo>
338   </xsl:template>
339
340   <xsl:template match="tml:c[@name='Bigl' or @name='Bigr' or @name='Bigm'][*[1][self::tml:o]]">
341 <!-- Bigl -->
342     <m:mo stretchy="true" minsize="11.5pt">
343       <xsl:if test="@id">
344         <xsl:attribute name="xref">
345           <xsl:value-of select="@id"/>
346         </xsl:attribute>
347       </xsl:if>
348       <xsl:value-of select="*[1]/@val"/>
349     </m:mo>
350   </xsl:template>
351
352   <xsl:template match="tml:c[@name='biggl' or @name='biggr' or @name='biggm'][*[1][self::tml:o]]">
353 <!-- biggl -->
354     <m:mo stretchy="true" minsize="14.5pt">
355       <xsl:if test="@id">
356         <xsl:attribute name="xref">
357           <xsl:value-of select="@id"/>
358         </xsl:attribute>
359       </xsl:if>
360       <xsl:value-of select="*[1]/@val"/>
361     </m:mo>
362   </xsl:template>
363
364   <xsl:template match="tml:c[@name='Biggl' or @name='Biggr' or @name='Biggm'][*[1][self::tml:o]]">
365 <!-- biggl -->
366     <m:mo stretchy="true" minsize="17.5pt">
367       <xsl:if test="@id">
368         <xsl:attribute name="xref">
369           <xsl:value-of select="@id"/>
370         </xsl:attribute>
371       </xsl:if>
372       <xsl:value-of select="*[1]/@val"/>
373     </m:mo>
374   </xsl:template>
375
376   <xsl:template match="tml:c[@name='hat']">
377 <!-- hat -->
378     <m:mover accent="true">
379       <xsl:if test="@id">
380         <xsl:attribute name="xref">
381           <xsl:value-of select="@id"/>
382         </xsl:attribute>
383       </xsl:if>
384       <xsl:apply-templates select="*[1]"/>
385       <m:mo>&#x0302;</m:mo>
386     </m:mover>
387   </xsl:template>
388
389   <xsl:template match="tml:c[@name='widehat']">
390 <!-- widehat -->
391     <m:mover accent="false">
392       <xsl:if test="@id">
393         <xsl:attribute name="xref">
394           <xsl:value-of select="@id"/>
395         </xsl:attribute>
396       </xsl:if>
397       <xsl:apply-templates select="*[1]"/>
398       <m:mo stretchy="true">&#x0302;</m:mo>
399     </m:mover>
400   </xsl:template>
401
402   <xsl:template match="tml:c[@name='check']">
403 <!-- check -->
404     <m:mover accent="true">
405       <xsl:if test="@id">
406         <xsl:attribute name="xref">
407           <xsl:value-of select="@id"/>
408         </xsl:attribute>
409       </xsl:if>
410       <xsl:apply-templates select="*[1]"/>
411       <m:mo>&#x030c;</m:mo>
412     </m:mover>
413   </xsl:template>
414
415   <xsl:template match="tml:c[@name='tilde']">
416 <!-- tilde -->
417     <m:mover accent="true">
418       <xsl:if test="@id">
419         <xsl:attribute name="xref">
420           <xsl:value-of select="@id"/>
421         </xsl:attribute>
422       </xsl:if>
423       <xsl:apply-templates select="*[1]"/>
424       <m:mo>&#x0303;</m:mo>
425     </m:mover>
426   </xsl:template>
427
428   <xsl:template match="tml:c[@name='widetilde']">
429 <!-- widetilde -->
430     <m:mover>
431       <xsl:if test="@id">
432         <xsl:attribute name="xref">
433           <xsl:value-of select="@id"/>
434         </xsl:attribute>
435       </xsl:if>
436       <xsl:apply-templates select="*[1]"/>
437       <m:mo stretchy="true">&#x0303;</m:mo>
438     </m:mover>>
439   </xsl:template>
440
441   <xsl:template match="tml:c[@name='acute']">
442 <!-- acute -->
443     <m:mover accent="true">
444       <xsl:if test="@id">
445         <xsl:attribute name="xref">
446           <xsl:value-of select="@id"/>
447         </xsl:attribute>
448       </xsl:if>
449       <xsl:apply-templates select="*[1]"/>
450       <m:mo>&#x0301;</m:mo>
451     </m:mover>
452   </xsl:template>
453
454   <xsl:template match="tml:c[@name='grave']">
455 <!-- grave -->
456     <m:mover accent="true">
457       <xsl:if test="@id">
458         <xsl:attribute name="xref">
459           <xsl:value-of select="@id"/>
460         </xsl:attribute>
461       </xsl:if>
462       <xsl:apply-templates select="*[1]"/>
463       <m:mo>&#x0300;</m:mo>
464     </m:mover>>
465   </xsl:template>
466
467   <xsl:template match="tml:c[@name='dot']">
468 <!-- dot -->
469     <m:mover accent="true">
470       <xsl:if test="@id">
471         <xsl:attribute name="xref">
472           <xsl:value-of select="@id"/>
473         </xsl:attribute>
474       </xsl:if>
475       <xsl:apply-templates select="*[1]"/>
476       <m:mo>&#x0307;</m:mo>
477     </m:mover>
478   </xsl:template>
479
480   <xsl:template match="tml:c[@name='ddot']">
481 <!-- ddot -->
482     <m:mover accent="true">
483       <xsl:if test="@id">
484         <xsl:attribute name="xref">
485           <xsl:value-of select="@id"/>
486         </xsl:attribute>
487       </xsl:if>
488       <xsl:apply-templates select="*[1]"/>
489       <m:mo>&#x0308;</m:mo>
490     </m:mover>
491   </xsl:template>
492
493   <xsl:template match="tml:c[@name='breve']">
494 <!-- breve -->
495     <m:mover accent="true">
496       <xsl:if test="@id">
497         <xsl:attribute name="xref">
498           <xsl:value-of select="@id"/>
499         </xsl:attribute>
500       </xsl:if>
501       <xsl:apply-templates select="*[1]"/>
502       <m:mo>&#x0306;</m:mo>
503     </m:mover>
504   </xsl:template>
505
506   <xsl:template match="tml:c[@name='bar']">
507 <!-- bar -->
508     <m:mover accent="true">
509       <xsl:if test="@id">
510         <xsl:attribute name="xref">
511           <xsl:value-of select="@id"/>
512         </xsl:attribute>
513       </xsl:if>
514       <xsl:apply-templates select="*[1]"/>
515       <m:mo>&#x0304;</m:mo>
516     </m:mover>
517   </xsl:template>
518
519   <xsl:template match="tml:c[@name='vec']">
520 <!-- vec -->
521     <m:mover accent="true">
522       <xsl:if test="@id">
523         <xsl:attribute name="xref">
524           <xsl:value-of select="@id"/>
525         </xsl:attribute>
526       </xsl:if>
527       <xsl:apply-templates select="*[1]"/>
528       <m:mo>&#x20d7;</m:mo>
529     </m:mover>
530   </xsl:template>
531
532   <xsl:template match="tml:c[@name='overline']">
533 <!-- overline -->
534     <m:mover>
535       <xsl:if test="@id">
536         <xsl:attribute name="xref">
537           <xsl:value-of select="@id"/>
538         </xsl:attribute>
539       </xsl:if>
540       <xsl:apply-templates select="*[1]"/>
541       <m:mo stretchy="true">&#x0305;</m:mo>
542     </m:mover>
543   </xsl:template>
544
545   <xsl:template match="tml:c[@name='underline']">
546 <!-- underline -->
547     <m:munder>
548       <xsl:if test="@id">
549         <xsl:attribute name="xref">
550           <xsl:value-of select="@id"/>
551         </xsl:attribute>
552       </xsl:if>
553       <xsl:apply-templates select="*[1]"/>
554       <m:mo stretchy="true">&#x0332;</m:mo>
555     </m:munder>
556   </xsl:template>
557
558   <xsl:template match="tml:c[@name='sqrt']">
559 <!-- sqrt -->
560     <m:msqrt>
561       <xsl:if test="@id">
562         <xsl:attribute name="xref">
563           <xsl:value-of select="@id"/>
564         </xsl:attribute>
565       </xsl:if>
566       <xsl:apply-templates select="*"/>
567     </m:msqrt>
568   </xsl:template>
569
570   <xsl:template match="tml:c[@name='root']">
571 <!-- root -->
572     <m:mroot>
573       <xsl:if test="@id">
574         <xsl:attribute name="xref">
575           <xsl:value-of select="@id"/>
576         </xsl:attribute>
577       </xsl:if>
578       <xsl:choose>
579         <xsl:when test="count(*) &lt; 2">
580           <m:mrow/>
581           <xsl:apply-templates select="*[1]"/>
582         </xsl:when>
583         <xsl:otherwise>
584           <xsl:apply-templates select="*[2]"/>
585           <xsl:apply-templates select="*[1]"/>
586         </xsl:otherwise>
587       </xsl:choose>
588     </m:mroot>
589   </xsl:template>
590
591   <xsl:template match="tml:c[@name='frac']">
592 <!-- frac -->
593     <m:mfrac>
594       <xsl:if test="@id">
595         <xsl:attribute name="xref">
596           <xsl:value-of select="@id"/>
597         </xsl:attribute>
598       </xsl:if>
599       <xsl:apply-templates select="*[1]"/>
600       <xsl:apply-templates select="*[2]"/>
601     </m:mfrac>
602   </xsl:template>
603
604   <xsl:template match="tml:c[@name='over']">
605 <!-- over -->
606     <m:mfrac>
607       <xsl:if test="@id">
608         <xsl:attribute name="xref">
609           <xsl:value-of select="@id"/>
610         </xsl:attribute>
611       </xsl:if>
612       <xsl:apply-templates select="*[1]"/>
613       <xsl:apply-templates select="*[2]"/>
614     </m:mfrac>
615   </xsl:template>
616
617   <xsl:template match="tml:c[@name='atop']">
618 <!-- atop -->
619     <m:mfrac linethickness="0">
620       <xsl:if test="@id">
621         <xsl:attribute name="xref">
622           <xsl:value-of select="@id"/>
623         </xsl:attribute>
624       </xsl:if>
625       <xsl:apply-templates select="*[1]"/>
626       <xsl:apply-templates select="*[2]"/>
627     </m:mfrac>
628   </xsl:template>
629
630   <xsl:template match="tml:c[@name='choose']">
631 <!-- choose -->
632     <m:mrow>
633       <xsl:if test="@id">
634         <xsl:attribute name="xref">
635           <xsl:value-of select="@id"/>
636         </xsl:attribute>
637       </xsl:if>
638       <m:mo stretchy="true">(</m:mo>
639       <m:mfrac linethickness="0">
640         <xsl:apply-templates select="*[1]"/>
641         <xsl:apply-templates select="*[2]"/>
642       </m:mfrac>
643       <m:mo stretchy="true">)</m:mo>
644     </m:mrow>
645   </xsl:template>
646
647   <xsl:template match="tml:c[@name='brace']">
648 <!-- brace -->
649     <m:mrow>
650       <xsl:if test="@id">
651         <xsl:attribute name="xref">
652           <xsl:value-of select="@id"/>
653         </xsl:attribute>
654       </xsl:if>
655       <m:mo stretchy="true">{</m:mo>
656       <m:mfrac linethickness="0">
657         <xsl:apply-templates select="*[1]"/>
658         <xsl:apply-templates select="*[2]"/>
659       </m:mfrac>
660       <m:mo stretchy="true">}</m:mo>
661     </m:mrow>
662   </xsl:template>
663
664   <xsl:template match="tml:c[@name='brack']">
665 <!-- brack -->
666     <m:mrow>
667       <xsl:if test="@id">
668         <xsl:attribute name="xref">
669           <xsl:value-of select="@id"/>
670         </xsl:attribute>
671       </xsl:if>
672       <m:mo stretchy="true">[</m:mo>
673       <m:mfrac linethickness="0">
674         <xsl:apply-templates select="*[1]"/>
675         <xsl:apply-templates select="*[2]"/>
676       </m:mfrac>
677       <m:mo stretchy="true">]</m:mo>
678     </m:mrow>
679   </xsl:template>
680
681   <xsl:template match="tml:c[@name='displaystyle']">
682 <!-- displaystyle -->
683     <m:mstyle displaystyle="true">
684       <xsl:if test="@id">
685         <xsl:attribute name="xref">
686           <xsl:value-of select="@id"/>
687         </xsl:attribute>
688       </xsl:if>
689       <xsl:apply-templates select="*[1]"/>
690     </m:mstyle>
691   </xsl:template>
692
693   <xsl:template match="tml:c[@name='textstyle']">
694 <!-- textstyle -->
695     <m:mstyle scriptlevel="0">
696       <xsl:if test="@id">
697         <xsl:attribute name="xref">
698           <xsl:value-of select="@id"/>
699         </xsl:attribute>
700       </xsl:if>
701       <xsl:apply-templates select="*[1]"/>
702       <xsl:if test="tml:g/tml:cursor">
703         <m:msub>
704           <m:mtext mathcolor="#808080">}</m:mtext>
705           <m:mtext><xsl:value-of select="@name"/></m:mtext>
706         </m:msub>
707       </xsl:if>
708     </m:mstyle>
709   </xsl:template>
710
711   <xsl:template match="tml:c[@name='scriptstyle']">
712 <!-- scriptstyle -->
713     <m:mstyle scriptlevel="1">
714       <xsl:if test="@id">
715         <xsl:attribute name="xref">
716           <xsl:value-of select="@id"/>
717         </xsl:attribute>
718       </xsl:if>
719       <xsl:apply-templates select="*[1]"/>
720     </m:mstyle>
721   </xsl:template>
722
723   <xsl:template match="tml:c[@name='scriptscriptstyle']">
724 <!-- scriptscriptstyle -->
725     <m:mstyle scriptlevel="2">
726       <xsl:if test="@id">
727         <xsl:attribute name="xref">
728           <xsl:value-of select="@id"/>
729         </xsl:attribute>
730       </xsl:if>
731       <xsl:apply-templates select="*[1]"/>
732     </m:mstyle>
733   </xsl:template>
734
735   <xsl:template match="tml:c[@name='pmod']">
736 <!-- pmod -->
737     <m:mrow>
738       <xsl:if test="@id">
739         <xsl:attribute name="xref">
740           <xsl:value-of select="@id"/>
741         </xsl:attribute>
742       </xsl:if>
743       <m:mo>(</m:mo>
744       <m:mrow>
745         <m:mo>mod</m:mo>
746         <xsl:apply-templates select="*[1]"/>
747       </m:mrow>
748       <m:mo>)</m:mo>
749     </m:mrow>
750   </xsl:template>
751
752   <xsl:template match="tml:c[@name='rm']">
753 <!-- rm -->
754     <m:mstyle mathvariant="normal">
755       <xsl:if test="@id">
756         <xsl:attribute name="xref">
757           <xsl:value-of select="@id"/>
758         </xsl:attribute>
759       </xsl:if>
760       <xsl:apply-templates select="*[1]"/>
761     </m:mstyle>
762   </xsl:template>
763
764   <xsl:template match="tml:c[@name='bf']">
765 <!-- bf -->
766     <m:mstyle mathvariant="bold">
767       <xsl:if test="@id">
768         <xsl:attribute name="xref">
769           <xsl:value-of select="@id"/>
770         </xsl:attribute>
771       </xsl:if>
772       <xsl:apply-templates select="*[1]"/>
773     </m:mstyle>
774   </xsl:template>
775
776   <xsl:template match="tml:c[@name='tt']">
777 <!-- tt -->
778     <m:mstyle mathvariant="monospace">
779       <xsl:if test="@id">
780         <xsl:attribute name="xref">
781           <xsl:value-of select="@id"/>
782         </xsl:attribute>
783       </xsl:if>
784       <xsl:apply-templates select="*[1]"/>
785     </m:mstyle>
786   </xsl:template>
787
788   <xsl:template match="tml:c[@name='sl']">
789 <!-- sl -->
790     <m:mstyle mathvariant="italic">
791       <xsl:if test="@id">
792         <xsl:attribute name="xref">
793           <xsl:value-of select="@id"/>
794         </xsl:attribute>
795       </xsl:if>
796       <xsl:apply-templates select="*[1]"/>
797     </m:mstyle>
798   </xsl:template>
799
800   <xsl:template match="tml:c[@name='it']">
801 <!-- it -->
802     <m:mstyle mathvariant="italic">
803       <xsl:if test="@id">
804         <xsl:attribute name="xref">
805           <xsl:value-of select="@id"/>
806         </xsl:attribute>
807       </xsl:if>
808       <xsl:apply-templates select="*[1]"/>
809     </m:mstyle>
810   </xsl:template>
811
812   <xsl:template match="tml:c[@name=',']">
813 <!-- , -->
814     <m:mspace width="thinmathspace">
815       <xsl:if test="@id">
816         <xsl:attribute name="xref">
817           <xsl:value-of select="@id"/>
818         </xsl:attribute>
819       </xsl:if>
820     </m:mspace>
821   </xsl:template>
822
823   <xsl:template match="tml:c[@name='&gt;']">
824 <!-- > -->
825     <m:mspace width="mediummathspace">
826       <xsl:if test="@id">
827         <xsl:attribute name="xref">
828           <xsl:value-of select="@id"/>
829         </xsl:attribute>
830       </xsl:if>
831     </m:mspace>
832   </xsl:template>
833
834   <xsl:template match="tml:c[@name=';']">
835 <!-- ; -->
836     <m:mspace width="thickmathspace">
837       <xsl:if test="@id">
838         <xsl:attribute name="xref">
839           <xsl:value-of select="@id"/>
840         </xsl:attribute>
841       </xsl:if>
842     </m:mspace>
843   </xsl:template>
844
845   <xsl:template match="tml:c[@name='!']">
846 <!-- ! -->
847     <m:mspace width="-0.166667em">
848       <xsl:if test="@id">
849         <xsl:attribute name="xref">
850           <xsl:value-of select="@id"/>
851         </xsl:attribute>
852       </xsl:if>
853     </m:mspace>
854   </xsl:template>
855
856   <xsl:template name="table-content">
857       <xsl:choose>
858         <xsl:when test="tml:row">
859           <xsl:apply-templates select="tml:row"/>
860         </xsl:when>
861         <xsl:otherwise>
862           <m:mtr>
863             <m:mtd>
864               <xsl:apply-templates select="*"/>
865             </m:mtd>
866           </m:mtr>
867         </xsl:otherwise>
868       </xsl:choose>
869   </xsl:template>
870
871   <xsl:template match="tml:c[@name='matrix']">
872 <!-- matrix -->
873     <m:mtable>
874       <xsl:if test="@id">
875         <xsl:attribute name="xref">
876           <xsl:value-of select="@id"/>
877         </xsl:attribute>
878       </xsl:if>
879       <xsl:call-template name="table-content"/>
880     </m:mtable>
881   </xsl:template>
882
883   <xsl:template match="tml:row">
884     <m:mtr>
885       <xsl:apply-templates select="tml:cell"/>
886     </m:mtr>
887   </xsl:template>
888
889   <xsl:template match="tml:cell">
890     <m:mtd>
891       <xsl:apply-templates select="*"/>
892     </m:mtd>
893   </xsl:template>
894
895   <xsl:template match="tml:c[@name='pmatrix']">
896 <!-- pmatrix -->
897     <m:mrow>
898       <xsl:if test="@id">
899         <xsl:attribute name="xref">
900           <xsl:value-of select="@id"/>
901         </xsl:attribute>
902       </xsl:if>
903       <m:mo stretchy="true">(</m:mo>
904       <m:mtable>
905         <xsl:call-template name="table-content"/>
906       </m:mtable>
907       <m:mo stretchy="true">)</m:mo>
908     </m:mrow>
909   </xsl:template>
910
911   <xsl:template match="tml:c[@name='bordermatrix']">
912 <!-- bordermatrix -->
913     <m:mtable>
914       <xsl:if test="@id">
915         <xsl:attribute name="xref">
916           <xsl:value-of select="@id"/>
917         </xsl:attribute>
918       </xsl:if>
919       <m:mtr>
920         <xsl:apply-templates select="tml:row[1]/tml:cell[1]"/>
921         <m:mtd/>
922         <xsl:apply-templates select="tml:row[1]/tml:cell[position() &gt; 1]"/>
923         <m:mtd/>
924       </m:mtr>
925       <xsl:for-each select="tml:row[position() &gt; 1]">
926         <m:mtr>
927           <xsl:apply-templates select="tml:cell[1]"/>
928           <xsl:if test="position() = 1">
929             <m:mtd rowspan="{count(../tml:row) - 1}">
930               <m:mo stretchy="true">(</m:mo>
931             </m:mtd>
932           </xsl:if>
933           <xsl:apply-templates select="tml:cell[position() &gt; 1]"/>
934           <xsl:if test="position() = 1">
935             <m:mtd rowspan="{count(../tml:row) - 1}">
936               <m:mo stretchy="true">)</m:mo>
937             </m:mtd>
938           </xsl:if>         
939         </m:mtr>
940       </xsl:for-each>      
941     </m:mtable>
942   </xsl:template>
943
944   <xsl:template match="tml:c[@name='overbrace']">
945 <!-- overbrace -->
946     <m:mover>
947       <xsl:if test="@id">
948         <xsl:attribute name="xref">
949           <xsl:value-of select="@id"/>
950         </xsl:attribute>
951       </xsl:if>
952       <xsl:apply-templates select="*[1]"/>
953       <m:mo stretchy="true">????</m:mo>
954     </m:mover>>
955   </xsl:template>
956
957   <xsl:template match="tml:c[@name='underbrace']">
958 <!-- underbrace -->
959     <m:munder>
960       <xsl:if test="@id">
961         <xsl:attribute name="xref">
962           <xsl:value-of select="@id"/>
963         </xsl:attribute>
964       </xsl:if>
965       <xsl:apply-templates select="*[1]"/>
966       <m:mo stretchy="true">????</m:mo>
967     </m:munder>
968   </xsl:template>
969
970   <xsl:template match="tml:c[@name='cases']">
971 <!-- cases -->
972     <m:mrow>
973       <xsl:if test="@id">
974         <xsl:attribute name="xref">
975           <xsl:value-of select="@id"/>
976         </xsl:attribute>
977       </xsl:if>
978       <m:mo stretchy="true">{</m:mo>
979       <m:mtable>
980         <xsl:call-template name="table-content"/>
981       </m:mtable>
982     </m:mrow>
983   </xsl:template>
984
985   <xsl:template match="tml:c[@name='red']">
986 <!-- red  -->
987     <m:mstyle mathcolor="red">
988       <xsl:if test="@id">
989         <xsl:attribute name="xref">
990           <xsl:value-of select="@id"/>
991         </xsl:attribute>
992         <xsl:apply-templates/>
993       </xsl:if>
994     </m:mstyle>
995   </xsl:template>
996
997   <xsl:template match="tml:c[@name='green']">
998 <!-- green  -->
999     <m:mstyle mathcolor="green">
1000       <xsl:if test="@id">
1001         <xsl:attribute name="xref">
1002           <xsl:value-of select="@id"/>
1003         </xsl:attribute>
1004         <xsl:apply-templates/>
1005       </xsl:if>
1006     </m:mstyle>
1007   </xsl:template>
1008
1009   <xsl:template match="tml:c[@name='duedelim']">
1010 <!-- duedelim  -->
1011     <m:mfrac>
1012       <xsl:if test="@id">
1013         <xsl:attribute name="xref">
1014           <xsl:value-of select="@id"/>
1015         </xsl:attribute>
1016       </xsl:if>
1017       <xsl:apply-templates select="*[1]"/>
1018       <xsl:apply-templates select="*[2]"/>
1019     </m:mfrac>
1020   </xsl:template>
1021
1022 </xsl:stylesheet>