Version 1.3.1dev.
[librarian.git] / librarian / xslt / normalize.xslt
1 <?xml version="1.0" encoding="utf-8"?>
2 <xsl:stylesheet version="1.0"
3     xmlns="http://nowoczesnapolska.org.pl/ML/Lektury/1.1"
4         
5     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
6     xmlns:wlf="http://wolnelektury.pl/functions"
7
8     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
9     xmlns:dc="http://purl.org/dc/elements/1.1/"
10
11     exclude-result-prefixes="wlf xsl"
12 >
13
14     <!-- Normalization Stylsheet for Wolne Lektury XML -->
15     <xsl:output method="xml" encoding="utf-8" indent="yes" />
16      
17     <xsl:strip-space elements="rdf:RDF rdf:Description meta doc main-text strofa stanza drama-line wlml:*" />
18
19     <xsl:param name="normalize-text" select="boolean(1)" />
20
21     <!-- Main entry point -->
22     <xsl:template match="/">
23         <doc>
24             <meta>
25                 <xsl:apply-templates select="//rdf:RDF" mode="meta"/>
26             </meta>
27
28             <xsl:variable name="body" select="/utwor/*[local-name() = name()]" />
29
30             <main-text class="{name($body)}">
31                 <xsl:apply-templates select="$body/node()" />
32             </main-text>
33
34             <annotations>
35                 <xsl:apply-templates select="//pr|pt|pe|pa" mode="annotations" />              
36             </annotations>
37         </doc>
38     </xsl:template>    
39
40     <xsl:template match="strofa">
41         <xsl:element name="stanza" namespace="http://nowoczesnapolska.org.pl/ML/Lektury/1.1">
42             <!-- normalize verses -->
43             <xsl:choose>
44                 <xsl:when test="count(br) > 0">
45                     <!-- First, collect all the tags up to first BR -->
46                     <xsl:call-template name="verse">
47                         <xsl:with-param name="verse-content" select="br[1]/preceding-sibling::node()" />
48                         <xsl:with-param name="verse-type" select="br[1]/preceding-sibling::*[name() = 'wers_wciety' or name() = 'wers_akap' or name() = 'wers_cd'][1]" />
49                     </xsl:call-template>
50
51                     <!-- Collect the rest of verses -->
52                     <xsl:for-each select="br">
53                                 <!-- Each BR tag "consumes" text after it -->
54                         <xsl:variable name="lnum" select="count(preceding-sibling::br)" />
55                         <xsl:call-template name="verse">
56                             <xsl:with-param name="verse-content"
57                                 select="following-sibling::node()[count(preceding-sibling::br) = $lnum+1 and name() != 'br']" />
58                             <xsl:with-param name="verse-type" select="following-sibling::*[count(preceding-sibling::br) = $lnum+1 and (name() = 'wers_wciety' or name() = 'wers_akap' or name() = 'wers_cd')][1]" />
59                         </xsl:call-template>
60                     </xsl:for-each>
61                 </xsl:when>
62
63                 <!-- No BR's - collect the whole content -->
64                 <xsl:otherwise>
65                     <xsl:call-template name="verse">
66                         <xsl:with-param name="verse-content" select="child::node()" />
67                         <xsl:with-param name="verse-type" select="wers_wciety|wers_akap|wers_cd[1]" />
68                     </xsl:call-template>
69                 </xsl:otherwise>
70
71             </xsl:choose>
72         </xsl:element>
73     </xsl:template>
74
75     <xsl:template name="verse">
76         <xsl:param name="verse-content" />
77         <xsl:param name="verse-type" />
78
79         <xsl:choose>
80             <xsl:when test="not($verse-type)">
81                 <xsl:element name="v" namespace="http://nowoczesnapolska.org.pl/ML/Lektury/1.1">
82                     <xsl:apply-templates select="$verse-content" />
83                 </xsl:element>
84             </xsl:when>
85
86             <xsl:otherwise>
87                 <xsl:apply-templates select="$verse-content" />
88             </xsl:otherwise>
89         </xsl:choose>
90     </xsl:template>
91
92
93     <!-- akapity -->
94     <xsl:template match="akap">
95         <xsl:element name="p">
96             <xsl:apply-templates select="@*|node()" />
97         </xsl:element>
98     </xsl:template>
99
100     <xsl:template match="akap_cd">
101         <xsl:element name="pc">
102             <xsl:apply-templates select="@*|node()" />
103         </xsl:element>
104     </xsl:template>
105
106     <xsl:template match="akap_dialog">
107         <xsl:element name="pd">
108             <xsl:variable name="prolog" select="./text()[1]" />            
109             <xsl:value-of select="wlf:fix-dialog-line($prolog)" />
110             <xsl:apply-templates select="@*|*|text()[. != $prolog]" />
111         </xsl:element>
112     </xsl:template>
113
114     <!-- wersy -->
115     <xsl:template match="wers_cd">
116         <xsl:element name="vc">
117             <xsl:apply-templates select="@*|node()" />
118         </xsl:element>
119     </xsl:template>
120
121     <xsl:template match="wers_akap">
122         <xsl:element name="vi">
123             <xsl:attribute name="size">p</xsl:attribute>
124             <xsl:apply-templates select="@*|node()" />
125         </xsl:element>
126     </xsl:template>
127
128     <xsl:template match="wers_wciety">
129         <xsl:element name="vi">
130             <xsl:if test="@typ">
131             <xsl:attribute name="size"><xsl:value-of select="@typ" /></xsl:attribute>
132             </xsl:if>
133             <xsl:apply-templates select="@*[name() != 'typ']|node()" />
134         </xsl:element>
135     </xsl:template>
136
137     <xsl:template match="zastepnik_wersu">
138         <xsl:element name="verse-skip">
139             <xsl:choose>
140                 <xsl:when test="starts-with(., '.')">
141                     <xsl:attribute name="type">dot</xsl:attribute>
142                 </xsl:when>
143             </xsl:choose> 
144         </xsl:element>
145     </xsl:template>
146
147     <!-- Przypisy i motywy -->
148     <xsl:template match="begin">
149         <xsl:element name="mark">
150             <xsl:attribute name="starts">
151                 <xsl:value-of select="substring(@id, 2)" />
152             </xsl:attribute>
153             <xsl:attribute name="themes">
154                 <xsl:value-of select="following-sibling::motyw[1]/text()" />
155             </xsl:attribute>
156         </xsl:element>
157     </xsl:template>
158
159     <xsl:template match="motyw" />
160
161     <xsl:template match="end">
162         <xsl:element name="mark">
163             <xsl:attribute name="ends">
164                 <xsl:value-of select="substring(@id, 2)" />
165             </xsl:attribute>
166         </xsl:element>
167     </xsl:template>
168
169     <xsl:template match="pa|pe|pr|pt">
170         <mark id="{generate-id(.)}" />
171     </xsl:template>
172
173
174     <xsl:template match="pa|pe|pr|pt" mode="annotations">
175         <annotation refs="{generate-id(.)}" type="{name(.)}">
176             <xsl:apply-templates select="@*|node()" />
177         </annotation>
178     </xsl:template>
179
180
181     <!-- Tytuły -->
182     <xsl:template match="autor_utworu">
183         <xsl:element name="author">
184             <xsl:apply-templates select="@*|node()" />
185         </xsl:element>
186     </xsl:template>
187
188     <xsl:template match="nazwa_utworu">
189         <xsl:element name="title">
190             <xsl:apply-templates select="@*|node()" />
191         </xsl:element>
192     </xsl:template>
193
194     <xsl:template match="naglowek_czesc">
195         <chapter>
196             <xsl:apply-templates select="@*|node()" />
197         </chapter>
198     </xsl:template>
199
200     <xsl:template match="naglowek_akt">
201         <act>
202             <xsl:apply-templates select="@*|node()" />
203         </act>
204     </xsl:template>
205
206     <xsl:template match="naglowek_scena">
207         <scene>
208             <xsl:apply-templates select="@*|node()" />
209         </scene>
210     </xsl:template>
211
212     <xsl:template match="podtytul">
213         <second-title>
214             <xsl:apply-templates select="@*|node()" />
215         </second-title>
216     </xsl:template>
217
218     <xsl:template match="srodtytul">
219         <part-title>
220             <xsl:apply-templates select="@*|node()" />
221         </part-title>
222     </xsl:template>
223
224     <!-- elementy dramatu -->
225     <xsl:template match="miejsce_czas">
226         <xsl:element name="time-and-date">
227             <xsl:apply-templates select="@*|node()" />
228         </xsl:element>
229     </xsl:template>
230
231
232     <xsl:template match="didaskalia|didask_tekst">
233         <xsl:element name="stage-directions">
234             <xsl:apply-templates select="@*|node()" />
235         </xsl:element>
236     </xsl:template>
237
238     <xsl:template match="motto">
239         <xsl:element name="motto">
240             <xsl:apply-templates select="@*|node()" />
241         
242         <xsl:variable name="sign" select="following-sibling::*[1][name() = 'motto_podpis']" />
243         <signature>
244             <xsl:apply-templates select="$sign/node()" />
245         </signature>
246         </xsl:element>
247     </xsl:template>
248
249     <xsl:template match="motto_podpis[preceding-sibling::*[1][name() = 'motto']]" />
250         
251     <xsl:template match="lista_osob">
252         <person-list>
253             <xsl:apply-templates select="@*|node()" />
254         </person-list>
255     </xsl:template>
256
257     <xsl:template match="naglowek_listy">
258         <caption>
259             <xsl:apply-templates select="@*|node()" />
260         </caption>
261     </xsl:template>
262
263     <xsl:template match="lista_osoba">
264         <person>
265             <xsl:apply-templates select="@*|node()" />
266         </person>
267     </xsl:template>
268
269     <!-- Odstępy i prześwity -->
270     <xsl:template match="sekcja_swiatlo">
271         <vertical-space />
272     </xsl:template>
273     
274     <xsl:template match="sekcja_asterysk">
275         <vertical-space type="asterisk" />
276     </xsl:template>
277
278     <xsl:template match="sekcja_asterysk">
279         <vertical-space type="line" />
280     </xsl:template>
281
282     <!-- pozostałe elementy blokowe -->
283     <xsl:template match="dlugi_cytat">
284         <block-quote>
285             <xsl:apply-templates select="@*|node()" />
286         </block-quote>`
287     </xsl:template>
288
289     <xsl:template match="poezja_cyt">
290         <block-quote>
291             <xsl:apply-templates select="@*|node()" />
292         </block-quote>`
293     </xsl:template>
294
295     <xsl:template match="kwestia">
296         <xsl:variable name="person" select="preceding-sibling::*[1][name() = 'naglowek_osoba']" />
297         <drama-line>
298             <person>
299                 <xsl:apply-templates select="$person/node()" />
300             </person>
301             <xsl:apply-templates select="node()[. != $person]" />
302         </drama-line>
303     </xsl:template>
304
305     <xsl:template match="naglowek_osoba[following-sibling::*[1][name() = 'kwestia']]" />
306         
307     <!-- Inne -->
308     <xsl:template match="osoba">
309         <xsl:element name="person-ref">
310             <xsl:apply-templates select="@*|node()" />
311         </xsl:element>
312     </xsl:template>
313
314     <xsl:template match="slowo_obce">
315         <xsl:element name="df">
316             <xsl:apply-templates select="@*|node()" />
317         </xsl:element>
318     </xsl:template>
319
320     <xsl:template match="wyroznienie">
321         <xsl:element name="em">
322             <xsl:apply-templates select="@*|node()" />
323         </xsl:element>
324     </xsl:template>
325
326     <xsl:template match="mat">
327         <xsl:element name="math">
328             <xsl:apply-templates select="@*|node()" />
329         </xsl:element>
330     </xsl:template>
331
332     <!-- oznaczenie tytulu innego utworu, wymienionego w tym -->
333     <xsl:template match="tytul_dziela">
334         <xsl:element name="book-ref">
335             <xsl:apply-templates select="@*|node()" />
336         </xsl:element>
337     </xsl:template>
338
339     <xsl:template match="extra">
340         <xsl:element name="comment">
341             <xsl:apply-templates select="@*|node()" />
342         </xsl:element>
343     </xsl:template>
344
345     <xsl:template match="uwaga">
346         <xsl:element name="edit-comment">
347             <xsl:apply-templates select="@*|node()" />
348         </xsl:element>
349     </xsl:template>
350
351     <!-- Copy attributes -->
352     <xsl:template match="@*|comment()">
353         <xsl:copy />
354     </xsl:template>    
355
356     <!-- Inside RDF meta-data, leave the text unchanged -->
357     <xsl:template match="rdf:RDF//text()">
358         <xsl:value-of select="." />
359     </xsl:template>
360
361     <!-- Normalize text in other nodes -->
362     <xsl:template match="text()">
363         <xsl:choose>
364             <xsl:when test="$normalize-text">
365                 <xsl:value-of select="wlf:normalize-text(.)" />
366             </xsl:when>
367             <xsl:otherwise>
368                 <xsl:value-of select="." />
369             </xsl:otherwise>
370         </xsl:choose>
371     </xsl:template>
372
373     <!-- Ignoruj RDF poza meta -->
374     <xsl:template match="rdf:*|dc:*" />
375    
376     <xsl:template match="@*|node()" mode="meta">
377         <xsl:copy>
378             <xsl:apply-templates match="@*|node()" mode="meta" />
379         </xsl:copy>
380     </xsl:template>
381
382     <!-- Warn about non-matched elements -->
383     <xsl:template match="node()">
384         <xsl:message>
385             <xsl:text>Nieprzetworzony węzeł:</xsl:text>
386             <xsl:value-of select="." />           
387         </xsl:message>
388         <unparsed-node>
389             <xsl:copy-of select="." />
390         </unparsed-node>
391     </xsl:template>
392     
393 </xsl:stylesheet>