Statistics
| Revision:

root / tmp / org.txm.core / res / org / txm / xml / xsl / tei / tools / html2tei.xsl @ 187

History | View | Annotate | Download (9.4 kB)

1
<?xml version="1.0" encoding="utf-8"?>
2
<xsl:stylesheet 
3
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
4
    exclude-result-prefixes="tei xs"
5
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
6
    xmlns="http://www.tei-c.org/ns/1.0" 
7
    xmlns:tei="http://www.tei-c.org/ns/1.0" 
8
    version="2.0" 
9
    xpath-default-namespace="http://www.w3.org/1999/xhtml">
10

    
11
  <xsl:output method="xml" indent="yes"/>
12

    
13
  <xsl:template match="html">
14
    <TEI>
15
      <xsl:apply-templates/>
16
    </TEI>
17
  </xsl:template>
18

    
19
  <xsl:template match="head">
20
    <teiHeader>
21
      <fileDesc>
22
        <titleStmt>
23
          <title>
24
            <xsl:value-of select="title"/>
25
          </title>
26
          <author>
27
            <xsl:value-of select="meta[@name='dc.Creator']/@content"/>
28
          </author>
29
        </titleStmt>
30
        <publicationStmt>
31
	  <p></p>
32
        </publicationStmt>
33
      </fileDesc>
34
    </teiHeader>
35
  </xsl:template>
36

    
37
  <xsl:template match="body">
38
    <text>
39
      <body>
40
      <xsl:variable name="Body">
41
	<HEAD level="1" magic="true">Start</HEAD>
42
        <xsl:apply-templates/>
43
      </xsl:variable>
44

    
45
      <xsl:variable name="Body2">
46
	<xsl:for-each select="$Body">
47
	  <xsl:apply-templates mode="pass1"/>
48
	</xsl:for-each>
49
      </xsl:variable>
50

    
51
      <xsl:for-each select="$Body2">
52
        <xsl:for-each-group select="tei:*" group-starting-with="tei:HEAD[@level='1']">
53
          <xsl:choose>
54
            <xsl:when test="self::tei:HEAD[@level='1']">
55
	      <xsl:call-template name="group-by-section"/>
56
            </xsl:when>
57
            <xsl:otherwise>
58
	      <xsl:call-template name="inSection"/>
59
            </xsl:otherwise>
60
          </xsl:choose>
61
        </xsl:for-each-group>
62
      </xsl:for-each>
63
    </body>
64
    </text>
65
  </xsl:template>
66

    
67

    
68
  <xsl:template name="group-by-section">
69
    <xsl:variable name="ThisHeader" select="number(@level)"/>
70
    <xsl:variable name="NextHeader" select="number(@level)+1"/>
71
    <xsl:choose>
72
      <xsl:when test="@magic">
73
	  <xsl:for-each-group select="current-group() except ."
74
			      group-starting-with="tei:HEAD[number(@level)=$NextHeader]">
75
	    <xsl:choose>
76
	      <xsl:when test="self::tei:HEAD">
77
		<xsl:call-template name="group-by-section"/>
78
	      </xsl:when>
79
	    <xsl:otherwise>
80
	      <xsl:call-template name="inSection"/>
81
	    </xsl:otherwise>
82
	    </xsl:choose>
83
	  </xsl:for-each-group>
84
      </xsl:when>
85
      <xsl:otherwise>
86
	<div>
87
	  <xsl:if test="@style">
88
	    <xsl:attribute name="rend" select="@style"/>
89
	  </xsl:if>
90
	  <xsl:if test="not(@interpolated='true')">
91
	    <head>
92
	      <xsl:apply-templates mode="pass1"/>
93
	    </head>
94
	  </xsl:if>
95
	  <xsl:for-each-group select="current-group() except ."
96
			      group-starting-with="tei:HEAD[number(@level)=$NextHeader]">
97
	    <xsl:choose>
98
	      <xsl:when test="self::tei:HEAD">
99
		<xsl:call-template name="group-by-section"/>
100
	      </xsl:when>
101
	    <xsl:otherwise>
102
		<xsl:call-template name="inSection"/>
103
	    </xsl:otherwise>
104
	    </xsl:choose>
105
	  </xsl:for-each-group>
106
	</div>
107
      </xsl:otherwise>
108
    </xsl:choose>
109
  </xsl:template>
110

    
111

    
112
  <xsl:template name="inSection">
113
    <xsl:for-each-group select="current-group()"
114
			group-adjacent="if (self::tei:GLOSS)
115
					then 1
116
					else 2">      
117
      <xsl:choose>
118
	<xsl:when test="current-grouping-key()=1">
119
	  <list type="gloss">
120
	    <xsl:for-each select="current-group()">
121
	      <xsl:element name="{@n}">
122
		<xsl:apply-templates mode="pass2"/>
123
	      </xsl:element>
124
	    </xsl:for-each>
125
	  </list>
126
	</xsl:when>
127
	<xsl:otherwise>
128
	  <xsl:for-each select="current-group()">
129
	    <xsl:apply-templates select="." mode="pass2"/>
130
	  </xsl:for-each>
131
	</xsl:otherwise>
132
      </xsl:choose>
133
    </xsl:for-each-group>
134
  </xsl:template>
135

    
136
  <xsl:template match="h1|h2|h3|h4|h5|h6|h7">
137
    <HEAD level="{substring(local-name(),2,1)}">
138
      <xsl:apply-templates select="@*"/>
139
      <xsl:apply-templates/>
140
    </HEAD>
141
  </xsl:template>
142
		
143
  <xsl:template match="@*|text()|comment()|processing-instruction()" mode="pass1">
144
    <xsl:copy-of select="."/>
145
  </xsl:template>
146

    
147
  <xsl:template match="tei:p[not(node())]"
148
		mode="pass1"/>
149

    
150
  <xsl:template match="tei:HEAD" mode="pass1">
151
    <xsl:if test="preceding-sibling::tei:HEAD">
152
      <xsl:variable name="prev"
153
		    select="xs:integer(number(preceding-sibling::tei:HEAD[1]/@level))"/>
154
      <xsl:variable name="current"
155
		    select="xs:integer(number(@level))"/>
156
	<xsl:if test="($current - $prev) &gt;1 ">
157
	  <!--<xsl:message>Walk from <xsl:value-of select="$prev"/> to <xsl:value-of select="$current"/></xsl:message>-->
158
	  <xsl:for-each
159
	      select="$prev + 1   to $current - 1 ">
160
	    <HEAD interpolated='true' level="{.}"/>
161
	  </xsl:for-each>
162
	</xsl:if>
163
    </xsl:if>
164
    <xsl:copy>
165
    <xsl:apply-templates
166
	select="*|@*|processing-instruction()|comment()|text()"
167
	mode="pass1"/>
168
    </xsl:copy>
169
  </xsl:template>
170

    
171
  <xsl:template match="*" mode="pass1">
172
    <xsl:copy>
173
      <xsl:apply-templates select="*|@*|processing-instruction()|comment()|text()" mode="pass1"/>
174
    </xsl:copy>
175
  </xsl:template>
176

    
177
  <xsl:template match="@*|text()|comment()|processing-instruction()" mode="pass2">
178
    <xsl:copy-of select="."/>
179
  </xsl:template>
180

    
181
  <xsl:template match="tei:p[not(*) and normalize-space(.)='']" mode="pass2"/>
182

    
183
  <xsl:template match="*" mode="pass2">
184
    <xsl:copy>
185
      <xsl:apply-templates select="*|@*|processing-instruction()|comment()|text()" mode="pass2"/>
186
    </xsl:copy>
187
  </xsl:template>
188

    
189
  <xsl:template match="br">
190
    <lb/>
191
  </xsl:template>
192

    
193
  <xsl:template match="a">
194
    <xsl:choose>
195
      <xsl:when test="@href">
196
        <ref target="{@href}">
197
          <xsl:apply-templates/>
198
        </ref>
199
      </xsl:when>
200
      <xsl:when test="@name">
201
        <anchor>
202
          <xsl:attribute name="xml:id" select="@name"/>
203
        </anchor>
204
        <xsl:apply-templates/>
205
      </xsl:when>
206
    </xsl:choose>
207
  </xsl:template>
208

    
209
  <xsl:template match="li">
210
    <item>
211
      <xsl:apply-templates/>
212
    </item>
213
  </xsl:template>
214

    
215
  <xsl:template match="div">
216
      <xsl:apply-templates/>
217
  </xsl:template>
218

    
219
  <xsl:template match="link">
220
</xsl:template>
221

    
222
  <xsl:template match="meta">
223
</xsl:template>
224

    
225
  <xsl:template match="p">
226
    <p>
227
      <xsl:apply-templates select="*|@*|text()|comment()"/>
228
    </p>
229
  </xsl:template>
230
  <xsl:template match="p[@class='note']">
231
    <note>
232
      <xsl:apply-templates select="*|@*|text()|comment()"/>
233
    </note>
234
  </xsl:template>
235
  <xsl:template match="title">
236
</xsl:template>
237
  <xsl:template match="ul">
238
    <list type="unordered">
239
      <xsl:apply-templates/>
240
    </list>
241
  </xsl:template>
242
  <xsl:template match="ol">
243
    <list type="ordered">
244
      <xsl:apply-templates/>
245
    </list>
246
  </xsl:template>
247
  <xsl:template match="em">
248
    <hi rend="italic">
249
      <xsl:apply-templates/>
250
    </hi>
251
  </xsl:template>
252
  <xsl:template match="img">
253
    <graphic url="{@src}">
254
      <xsl:for-each select="@width">
255
        <xsl:attribute name="width">
256
          <xsl:value-of select="."/>
257
          <xsl:analyze-string select="." regex="^[0-9]+$">
258
            <xsl:matching-substring>
259
              <xsl:text>px</xsl:text>
260
            </xsl:matching-substring>
261
          </xsl:analyze-string>
262
        </xsl:attribute>
263
      </xsl:for-each>
264
      <xsl:for-each select="@height">
265
        <xsl:attribute name="height">
266
          <xsl:value-of select="."/>
267
          <xsl:analyze-string select="." regex="^[0-9]+$">
268
            <xsl:matching-substring>
269
              <xsl:text>px</xsl:text>
270
            </xsl:matching-substring>
271
          </xsl:analyze-string>
272
        </xsl:attribute>
273
      </xsl:for-each>
274
    </graphic>
275
  </xsl:template>
276

    
277
  <xsl:template match="pre">
278
    <eg>
279
      <xsl:apply-templates/>
280
    </eg>
281
  </xsl:template>
282

    
283
  <xsl:template match="strong">
284
    <hi rend="bold">
285
      <xsl:apply-templates/>
286
    </hi>
287
  </xsl:template>
288

    
289
  <xsl:template match="sup">
290
    <hi rend="sup">
291
      <xsl:apply-templates/>
292
    </hi>
293
  </xsl:template>
294

    
295
  <xsl:template match="@class">
296
    <xsl:attribute name="rend" select="."/>
297
  </xsl:template>
298

    
299
  <xsl:template match="@id">
300
    <xsl:attribute name="xml:id" select="."/>
301
  </xsl:template>
302

    
303
  <xsl:template match="@title"/>
304

    
305
  <xsl:template match="@*|comment()|text()">
306
    <xsl:copy-of select="."/>
307
  </xsl:template>
308

    
309
  <xsl:template match="span">
310
    <hi>
311
      <xsl:if test="@class">
312
	<xsl:attribute name="rend" select="@class"/>
313
      </xsl:if>
314
      <xsl:apply-templates select="@*|*|text()"/>
315
    </hi>
316
  </xsl:template>
317

    
318
  <xsl:template match="b">
319
    <hi rend="bold">
320
      <xsl:apply-templates select="@*|*|text()"/>
321
    </hi>
322
  </xsl:template>
323

    
324
  <xsl:template match="i">
325
    <hi rend="italic">
326
      <xsl:apply-templates select="@*|*|text()"/>
327
    </hi>
328
  </xsl:template>
329

    
330
  <xsl:template match="font">
331
      <xsl:apply-templates/>
332
  </xsl:template>
333

    
334
  <xsl:template match="blockquote">
335
    <quote>
336
      <xsl:apply-templates select="@*|*|text()"/>
337
    </quote>
338
  </xsl:template>
339

    
340
  <xsl:template match="tt">
341
    <code>
342
      <xsl:apply-templates select="@*|*|text()"/>
343
    </code>
344
  </xsl:template>
345

    
346
  <xsl:template match="code">
347
    <eg>
348
      <xsl:apply-templates select="@*|*|text()"/>
349
    </eg>
350
  </xsl:template>
351

    
352
  <xsl:template match="table">
353
    <table>
354
      <xsl:apply-templates select="@*|*|text()"/>
355
    </table>
356
  </xsl:template>
357

    
358
  <xsl:template match="td">
359
    <cell>
360
      <xsl:apply-templates select="@*|*|text()"/>
361
    </cell>
362
  </xsl:template>
363

    
364
  <xsl:template match="tr">
365
    <row>
366
      <xsl:apply-templates select="@*|*|text()"/>
367
    </row>
368
  </xsl:template>
369

    
370
  <xsl:template match="hr"/>
371

    
372
  <xsl:template match="*">
373
    <xsl:message>UNKNOWN TAG <xsl:value-of select="name()"/></xsl:message>
374
    <xsl:apply-templates/>
375
  </xsl:template>
376

    
377
</xsl:stylesheet>