UNIMARC XSLT enhancement
[koha.git] / koha-tmpl / opac-tmpl / prog / en / xslt / UNIMARCslim2OPACDetail.xsl
1 <?xml version="1.0" encoding="UTF-8"?>
2 <xsl:stylesheet version="1.0"
3   xmlns:marc="http://www.loc.gov/MARC21/slim"
4   xmlns:items="http://www.koha.org/items"
5   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
6   exclude-result-prefixes="marc items">
7
8 <xsl:import href="UNIMARCslimUtils.xsl"/>
9 <xsl:output method = "xml" indent="yes" omit-xml-declaration = "yes" />
10 <xsl:template match="/">
11   <xsl:apply-templates/>
12 </xsl:template>
13
14 <xsl:template match="marc:record">
15   <xsl:variable name="leader" select="marc:leader"/>
16   <xsl:variable name="leader6" select="substring($leader,7,1)"/>
17   <xsl:variable name="leader7" select="substring($leader,8,1)"/>
18   <xsl:variable name="biblionumber" select="marc:datafield[@tag=090]/marc:subfield[@code='a']"/>
19   
20
21   <xsl:if test="marc:datafield[@tag=200]">
22     <xsl:for-each select="marc:datafield[@tag=200]">
23       <h1>
24         <xsl:call-template name="addClassRtl" />
25         <xsl:variable name="title" select="marc:subfield[@code='a']"/>
26         <xsl:variable name="ntitle"
27          select="translate($title, '&#x0098;&#x009C;','')"/>
28         <xsl:value-of select="$ntitle" />
29         <xsl:if test="marc:subfield[@code='e']">
30           <xsl:text> : </xsl:text>
31           <xsl:for-each select="marc:subfield[@code='e']">
32             <xsl:value-of select="."/>
33           </xsl:for-each>
34         </xsl:if>
35         <xsl:if test="marc:subfield[@code='b']">
36           <xsl:text> [</xsl:text>
37           <xsl:value-of select="marc:subfield[@code='b']"/>
38           <xsl:text>]</xsl:text>
39         </xsl:if>
40         <xsl:if test="marc:subfield[@code='f']">
41           <xsl:text> / </xsl:text>
42           <xsl:value-of select="marc:subfield[@code='f']"/>
43         </xsl:if>
44         <xsl:if test="marc:subfield[@code='g']">
45           <xsl:text> ; </xsl:text>
46           <xsl:value-of select="marc:subfield[@code='g']"/>
47         </xsl:if>
48       </h1>
49     </xsl:for-each>
50   </xsl:if>
51
52   <div id="views">
53     <span class="view">
54       <span id="Normalview">Normal View</span>
55     </span>
56     <span class="view">
57       <a id="MARCviewPop" href="/cgi-bin/koha/opac-showmarc.pl?id={marc:datafield[@tag=090]/marc:subfield[@code='a']}" title="MARC" rel="gb_page_center[600,500]">MARC View</a>
58     </span>
59     <span class="view">
60       <a id="MARCview" href="/cgi-bin/koha/opac-MARCdetail.pl?biblionumber={marc:datafield[@tag=090]/marc:subfield[@code='a']}" title="MARC">Expanded MARC View</a>
61     </span>
62     <span class="view">
63       <a id="ISBDview" href="/cgi-bin/koha/opac-ISBDdetail.pl?biblionumber={marc:datafield[@tag=090]/marc:subfield[@code='a']}">Card View (ISBD)</a>
64     </span>
65   </div>
66   
67   <xsl:call-template name="tag_4xx" />
68
69   <xsl:call-template name="tag_7xx">
70     <xsl:with-param name="tag">700</xsl:with-param>
71     <xsl:with-param name="label">Auteur principal</xsl:with-param>
72   </xsl:call-template>
73
74   <xsl:call-template name="tag_7xx">
75     <xsl:with-param name="tag">710</xsl:with-param>
76     <xsl:with-param name="label">Collectivité principale</xsl:with-param>
77   </xsl:call-template>
78
79   <xsl:call-template name="tag_7xx">
80     <xsl:with-param name="tag">701</xsl:with-param>
81     <xsl:with-param name="label">Co-auteur</xsl:with-param>
82   </xsl:call-template>
83
84   <xsl:call-template name="tag_7xx">
85     <xsl:with-param name="tag">702</xsl:with-param>
86     <xsl:with-param name="label">Auteur</xsl:with-param>
87   </xsl:call-template>
88
89   <xsl:call-template name="tag_7xx">
90     <xsl:with-param name="tag">711</xsl:with-param>
91     <xsl:with-param name="label">Collectivité co-auteur</xsl:with-param>
92   </xsl:call-template>
93
94   <xsl:call-template name="tag_7xx">
95     <xsl:with-param name="tag">712</xsl:with-param>
96     <xsl:with-param name="label">Collectivité secondaire</xsl:with-param>
97   </xsl:call-template>
98
99   <xsl:if test="marc:datafield[@tag=101]">
100           <span class="results_summary">
101       <span class="label">Langue: </span>
102       <xsl:for-each select="marc:datafield[@tag=101]">
103         <xsl:for-each select="marc:subfield">
104           <xsl:choose>
105             <xsl:when test="@code='b'">de la trad. intermédiaire, </xsl:when>
106             <xsl:when test="@code='c'">de l'œuvre originale, </xsl:when>
107             <xsl:when test="@code='d'">du résumé, </xsl:when>
108             <xsl:when test="@code='e'">de la table des matières, </xsl:when>
109             <xsl:when test="@code='f'">de la page de titre, </xsl:when>
110             <xsl:when test="@code='g'">du titre propre, </xsl:when>
111             <xsl:when test="@code='h'">d'un livret, </xsl:when>
112             <xsl:when test="@code='i'">des textes d'accompagnement, </xsl:when>
113             <xsl:when test="@code='j'">des sous-titres, </xsl:when>
114           </xsl:choose>
115           <xsl:value-of select="text()"/>
116           <xsl:choose>
117             <xsl:when test="position()=last()">
118               <xsl:text>.</xsl:text>
119             </xsl:when>
120             <xsl:otherwise>
121               <xsl:text> ; </xsl:text>
122             </xsl:otherwise>
123           </xsl:choose>
124         </xsl:for-each>
125       </xsl:for-each>
126     </span>
127   </xsl:if>
128
129   <xsl:if test="marc:datafield[@tag=102]">
130           <span class="results_summary">
131       <span class="label">Pays: </span>
132       <xsl:for-each select="marc:datafield[@tag=102]">
133         <xsl:for-each select="marc:subfield">
134           <xsl:value-of select="text()"/>
135           <xsl:choose>
136             <xsl:when test="position()=last()">
137               <xsl:text>.</xsl:text>
138             </xsl:when>
139               <xsl:otherwise><xsl:text>, </xsl:text>
140             </xsl:otherwise>
141           </xsl:choose>
142         </xsl:for-each>
143       </xsl:for-each>
144     </span>
145   </xsl:if>
146
147   <xsl:call-template name="tag_210" />
148
149   <xsl:call-template name="tag_215" />
150
151   <abbr class="unapi-id" title="koha:biblionumber:{marc:datafield[@tag=090]/marc:subfield[@code='a']}"><!-- unAPI --></abbr>
152
153   <xsl:if test="marc:datafield[@tag=010]/marc:subfield[@code='a']">
154     <span class="results_summary"><span class="label">ISBN: </span>
155     <xsl:for-each select="marc:datafield[@tag=010]">
156       <xsl:variable name="isbn" select="marc:subfield[@code='a']"/>
157       <xsl:value-of select="marc:subfield[@code='a']"/>
158       <xsl:choose>
159         <xsl:when test="position()=last()">
160           <xsl:text>.</xsl:text>
161         </xsl:when>
162         <xsl:otherwise>
163           <xsl:text> ; </xsl:text>
164         </xsl:otherwise>
165       </xsl:choose>
166     </xsl:for-each>
167     </span>
168   </xsl:if>
169
170   <xsl:if test="marc:datafield[@tag=011]">
171     <span class="results_summary">
172       <span class="label">ISSN: </span>
173       <xsl:for-each select="marc:datafield[@tag=011]">
174         <xsl:value-of select="marc:subfield[@code='a']"/>
175         <xsl:choose>
176           <xsl:when test="position()=last()">
177             <xsl:text>.</xsl:text>
178           </xsl:when>
179           <xsl:otherwise>
180             <xsl:text>; </xsl:text>
181           </xsl:otherwise>
182         </xsl:choose>
183       </xsl:for-each>
184     </span>
185   </xsl:if>
186
187   <xsl:call-template name="tag_title">
188     <xsl:with-param name="tag">225</xsl:with-param>
189     <xsl:with-param name="label">Collection</xsl:with-param>
190   </xsl:call-template>
191
192   <xsl:if test="marc:datafield[@tag=676]">
193     <span class="results_summary">
194     <span class="label">Dewey: </span>
195       <xsl:for-each select="marc:datafield[@tag=676]">
196         <xsl:value-of select="marc:subfield[@code='a']"/>
197         <xsl:if test="marc:subfield[@code='v']">
198           <xsl:text>, </xsl:text>
199           <xsl:value-of select="marc:subfield[@code='v']"/>
200         </xsl:if>
201         <xsl:if test="marc:subfield[@code='z']">
202           <xsl:text>, </xsl:text>
203           <xsl:value-of select="marc:subfield[@code='z']"/>
204         </xsl:if>
205         <xsl:if test="not (position()=last())">
206           <xsl:text> ; </xsl:text>
207         </xsl:if>
208       </xsl:for-each>
209     </span>
210   </xsl:if>
211
212   <xsl:if test="marc:datafield[@tag=686]">
213     <span class="results_summary">
214     <span class="label">Classification: </span>
215       <xsl:for-each select="marc:datafield[@tag=686]">
216         <xsl:value-of select="marc:subfield[@code='a']"/>
217         <xsl:if test="marc:subfield[@code='b']">
218           <xsl:text>, </xsl:text>
219           <xsl:value-of select="marc:subfield[@code='b']"/>
220         </xsl:if>
221         <xsl:if test="marc:subfield[@code='c']">
222           <xsl:text>, </xsl:text>
223           <xsl:value-of select="marc:subfield[@code='c']"/>
224         </xsl:if>
225         <xsl:if test="not (position()=last())"><xsl:text> ; </xsl:text></xsl:if>
226       </xsl:for-each>
227     </span>
228   </xsl:if>
229
230   <xsl:if test="marc:datafield[@tag=327]">
231     <span class="results_summary">
232       <span class="label">Note de contenu: </span>
233       <xsl:for-each select="marc:datafield[@tag=327]">
234         <xsl:call-template name="chopPunctuation">
235           <xsl:with-param name="chopString">
236             <xsl:call-template name="subfieldSelect">
237                 <xsl:with-param name="codes">abcdjpvxyz</xsl:with-param>
238                 <xsl:with-param name="subdivCodes">jpxyz</xsl:with-param>
239                 <xsl:with-param name="subdivDelimiter">-- </xsl:with-param>
240             </xsl:call-template>
241           </xsl:with-param>
242         </xsl:call-template>
243       </xsl:for-each>
244     </span>
245   </xsl:if>
246
247   <xsl:if test="marc:datafield[@tag=330]">
248     <span class="results_summary">
249       <span class="label">Résumé: </span>
250       <xsl:for-each select="marc:datafield[@tag=330]">
251         <xsl:value-of select="marc:subfield[@code='a']"/>
252         <xsl:choose>
253           <xsl:when test="position()=last()">
254             <xsl:text>.</xsl:text>
255           </xsl:when>
256           <xsl:otherwise>
257             <xsl:text>; </xsl:text>
258           </xsl:otherwise>
259         </xsl:choose>
260       </xsl:for-each>
261     </span>
262   </xsl:if>
263
264   <xsl:if test="marc:datafield[@tag=317]">
265     <span class="results_summary">
266       <span class="label">Note sur la provenance: </span>
267       <xsl:for-each select="marc:datafield[@tag=317]">
268           <xsl:value-of select="marc:subfield[@code='a']"/>      
269       </xsl:for-each>
270     </span>
271   </xsl:if>
272
273   <xsl:if test="marc:datafield[@tag=320]">
274     <span class="results_summary">
275       <span class="label">Bibliographie: </span>
276       <xsl:for-each select="marc:datafield[@tag=320]">
277         <xsl:value-of select="marc:subfield[@code='a']"/>
278         <xsl:choose><xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
279       </xsl:for-each>
280     </span>
281   </xsl:if>
282
283   <xsl:if test="marc:datafield[@tag=328]">
284     <span class="results_summary">
285       <span class="label">Thèse: </span>
286       <xsl:for-each select="marc:datafield[@tag=328]">
287         <xsl:value-of select="marc:subfield[@code='a']"/>
288         <xsl:choose><xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
289       </xsl:for-each>
290     </span>
291   </xsl:if>
292
293   <xsl:if test="marc:datafield[@tag=333]">
294     <span class="results_summary">
295       <span class="label">Public: </span>
296       <xsl:for-each select="marc:datafield[@tag=333]">
297         <xsl:value-of select="marc:subfield[@code='a']"/>
298         <xsl:choose><xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
299       </xsl:for-each>
300     </span>
301   </xsl:if>
302
303   <xsl:call-template name="tag_subject">
304     <xsl:with-param name="tag">600</xsl:with-param>
305     <xsl:with-param name="label">Sujet - Nom de personne</xsl:with-param>
306   </xsl:call-template>
307
308   <xsl:call-template name="tag_subject">
309     <xsl:with-param name="tag">601</xsl:with-param>
310     <xsl:with-param name="label">Sujet - Collectivité</xsl:with-param>
311   </xsl:call-template>
312
313   <xsl:call-template name="tag_subject">
314     <xsl:with-param name="tag">602</xsl:with-param>
315     <xsl:with-param name="label">Sujet - Famille</xsl:with-param>
316   </xsl:call-template>
317
318   <xsl:call-template name="tag_subject">
319     <xsl:with-param name="tag">604</xsl:with-param>
320     <xsl:with-param name="label">Sujet - Auteur/titre</xsl:with-param>
321   </xsl:call-template>
322
323   <xsl:call-template name="tag_subject">
324     <xsl:with-param name="tag">606</xsl:with-param>
325     <xsl:with-param name="label">Sujet - Nom commun</xsl:with-param>
326   </xsl:call-template>
327
328   <xsl:call-template name="tag_subject">
329     <xsl:with-param name="tag">607</xsl:with-param>
330     <xsl:with-param name="label">Sujet - Nom géographique</xsl:with-param>
331   </xsl:call-template>
332
333   <xsl:call-template name="tag_subject">
334     <xsl:with-param name="tag">608</xsl:with-param>
335     <xsl:with-param name="label">Sujet - Forme</xsl:with-param>
336   </xsl:call-template>
337
338   <xsl:call-template name="tag_subject">
339     <xsl:with-param name="tag">610</xsl:with-param>
340     <xsl:with-param name="label">Sujet</xsl:with-param>
341   </xsl:call-template>
342
343   <xsl:call-template name="tag_subject">
344     <xsl:with-param name="tag">615</xsl:with-param>
345     <xsl:with-param name="label">Catégorie sujet</xsl:with-param>
346   </xsl:call-template>
347
348   <xsl:call-template name="tag_subject">
349     <xsl:with-param name="tag">616</xsl:with-param>
350     <xsl:with-param name="label">Marque déposée</xsl:with-param>
351   </xsl:call-template>
352
353   <xsl:if test="marc:datafield[@tag=856]">
354     <span class="results_summary">
355       <span class="label">Online Resources: </span>
356       <xsl:for-each select="marc:datafield[@tag=856]">
357         <a>
358           <xsl:attribute name="href">
359             <xsl:value-of select="marc:subfield[@code='u']"/>
360           </xsl:attribute>
361           <xsl:choose>
362             <xsl:when test="marc:subfield[@code='y' or @code='3' or @code='z']">
363               <xsl:call-template name="subfieldSelect">
364                 <xsl:with-param name="codes">y3z</xsl:with-param>
365               </xsl:call-template>
366             </xsl:when>
367             <xsl:when test="not(marc:subfield[@code='y']) and not(marc:subfield[@code='3']) and not(marc:subfield[@code='z'])">
368               Click here to access online
369             </xsl:when>
370           </xsl:choose>
371         </a>
372         <xsl:choose>
373           <xsl:when test="position()=last()"></xsl:when>
374           <xsl:otherwise> | </xsl:otherwise>
375         </xsl:choose>      
376       </xsl:for-each>
377     </span>
378   </xsl:if>
379
380         <!-- 780 -->
381         <xsl:if test="marc:datafield[@tag=780]">
382         <xsl:for-each select="marc:datafield[@tag=780]">
383         <span class="results_summary"><span class="label">
384         <xsl:choose>
385         <xsl:when test="@ind2=0">
386             Continues:
387         </xsl:when>
388         <xsl:when test="@ind2=1">
389             Continues in part:
390         </xsl:when>
391         <xsl:when test="@ind2=2">
392             Supersedes:
393         </xsl:when>
394         <xsl:when test="@ind2=3">
395             Supersedes in part:
396         </xsl:when>
397         <xsl:when test="@ind2=4">
398             Formed by the union: ... and: ...
399         </xsl:when>
400         <xsl:when test="@ind2=5">
401             Absorbed:
402         </xsl:when>
403         <xsl:when test="@ind2=6">
404             Absorbed in part:
405         </xsl:when>
406         <xsl:when test="@ind2=7">
407             Separated from:
408         </xsl:when>
409         </xsl:choose>
410         </span>
411                 <xsl:variable name="f780">
412                     <xsl:call-template name="subfieldSelect">
413                         <xsl:with-param name="codes">at</xsl:with-param>
414                     </xsl:call-template>
415                 </xsl:variable>
416              <a><xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=<xsl:value-of select="translate($f780, '()', '')"/></xsl:attribute>
417                 <xsl:value-of select="translate($f780, '()', '')"/>
418             </a>
419         </span>
420  
421         <xsl:choose>
422         <xsl:when test="@ind1=0">
423             <span class="results_summary"><xsl:value-of select="marc:subfield[@code='n']"/></span>
424         </xsl:when>
425         </xsl:choose>
426
427         </xsl:for-each>
428         </xsl:if>
429
430         <!-- 785 -->
431         <xsl:if test="marc:datafield[@tag=785]">
432         <xsl:for-each select="marc:datafield[@tag=785]">
433         <span class="results_summary"><span class="label">
434         <xsl:choose>
435         <xsl:when test="@ind2=0">
436             Continued by:
437         </xsl:when>
438         <xsl:when test="@ind2=1">
439             Continued in part by:
440         </xsl:when>
441         <xsl:when test="@ind2=2">
442             Superseded by:
443         </xsl:when>
444         <xsl:when test="@ind2=3">
445             Superseded in part by:
446         </xsl:when>
447         <xsl:when test="@ind2=4">
448             Absorbed by:
449         </xsl:when>
450         <xsl:when test="@ind2=5">
451             Absorbed in part by:
452         </xsl:when>
453         <xsl:when test="@ind2=6">
454             Split into .. and ...:
455         </xsl:when>
456         <xsl:when test="@ind2=7">
457             Merged with ... to form ...
458         </xsl:when>
459         <xsl:when test="@ind2=8">
460             Changed back to:
461         </xsl:when>
462
463         </xsl:choose>
464         </span>
465                    <xsl:variable name="f785">
466                     <xsl:call-template name="subfieldSelect">
467                         <xsl:with-param name="codes">at</xsl:with-param>
468                     </xsl:call-template>
469                 </xsl:variable>
470
471                 <a><xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=<xsl:value-of select="translate($f785, '()', '')"/></xsl:attribute>
472                 <xsl:value-of select="translate($f785, '()', '')"/>
473             </a>
474
475         </span>
476         </xsl:for-each>
477         </xsl:if>
478
479     </xsl:template>
480
481     <xsl:template name="nameABCDQ">
482             <xsl:call-template name="chopPunctuation">
483                 <xsl:with-param name="chopString">
484                     <xsl:call-template name="subfieldSelect">
485                         <xsl:with-param name="codes">aq</xsl:with-param>
486                     </xsl:call-template>
487                 </xsl:with-param>
488                 <xsl:with-param name="punctuation">
489                     <xsl:text>:,;/ </xsl:text>
490                 </xsl:with-param>
491             </xsl:call-template>
492         <xsl:call-template name="termsOfAddress"/>
493     </xsl:template>
494
495     <xsl:template name="nameABCDN">
496         <xsl:for-each select="marc:subfield[@code='a']">
497                 <xsl:call-template name="chopPunctuation">
498                     <xsl:with-param name="chopString" select="."/>
499                 </xsl:call-template>
500         </xsl:for-each>
501         <xsl:for-each select="marc:subfield[@code='b']">
502                 <xsl:value-of select="."/>
503         </xsl:for-each>
504         <xsl:if test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
505                 <xsl:call-template name="subfieldSelect">
506                     <xsl:with-param name="codes">cdn</xsl:with-param>
507                 </xsl:call-template>
508         </xsl:if>
509     </xsl:template>
510
511     <xsl:template name="nameACDEQ">
512             <xsl:call-template name="subfieldSelect">
513                 <xsl:with-param name="codes">acdeq</xsl:with-param>
514             </xsl:call-template>
515     </xsl:template>
516     <xsl:template name="termsOfAddress">
517         <xsl:if test="marc:subfield[@code='b' or @code='c']">
518             <xsl:call-template name="chopPunctuation">
519                 <xsl:with-param name="chopString">
520                     <xsl:call-template name="subfieldSelect">
521                         <xsl:with-param name="codes">bc</xsl:with-param>
522                     </xsl:call-template>
523                 </xsl:with-param>
524             </xsl:call-template>
525         </xsl:if>
526     </xsl:template>
527
528     <xsl:template name="part">
529         <xsl:variable name="partNumber">
530             <xsl:call-template name="specialSubfieldSelect">
531                 <xsl:with-param name="axis">n</xsl:with-param>
532                 <xsl:with-param name="anyCodes">n</xsl:with-param>
533                 <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
534             </xsl:call-template>
535         </xsl:variable>
536         <xsl:variable name="partName">
537             <xsl:call-template name="specialSubfieldSelect">
538                 <xsl:with-param name="axis">p</xsl:with-param>
539                 <xsl:with-param name="anyCodes">p</xsl:with-param>
540                 <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
541             </xsl:call-template>
542         </xsl:variable>
543         <xsl:if test="string-length(normalize-space($partNumber))">
544                 <xsl:call-template name="chopPunctuation">
545                     <xsl:with-param name="chopString" select="$partNumber"/>
546                 </xsl:call-template>
547         </xsl:if>
548         <xsl:if test="string-length(normalize-space($partName))">
549                 <xsl:call-template name="chopPunctuation">
550                     <xsl:with-param name="chopString" select="$partName"/>
551                 </xsl:call-template>
552         </xsl:if>
553     </xsl:template>
554
555     <xsl:template name="specialSubfieldSelect">
556         <xsl:param name="anyCodes"/>
557         <xsl:param name="axis"/>
558         <xsl:param name="beforeCodes"/>
559         <xsl:param name="afterCodes"/>
560         <xsl:variable name="str">
561             <xsl:for-each select="marc:subfield">
562                 <xsl:if test="contains($anyCodes, @code)      or (contains($beforeCodes,@code) and following-sibling::marc:subfield[@code=$axis])      or (contains($afterCodes,@code) and preceding-sibling::marc:subfield[@code=$axis])">
563                     <xsl:value-of select="text()"/>
564                     <xsl:text> </xsl:text>
565                 </xsl:if>
566             </xsl:for-each>
567         </xsl:variable>
568         <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
569     </xsl:template>
570
571 </xsl:stylesheet>