Formatting changes for OPAC xslt and staff client catalog detail pages. Fixes Bug...
[koha.git] / koha-tmpl / opac-tmpl / prog / en / xslt / MARC21slim2OPACDetail.xsl
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- $Id: MARC21slim2DC.xsl,v 1.1 2003/01/06 08:20:27 adam Exp $ -->
3 <xsl:stylesheet version="1.0"
4   xmlns:marc="http://www.loc.gov/MARC21/slim"
5   xmlns:items="http://www.koha.org/items"
6   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
7   exclude-result-prefixes="marc items">
8     <xsl:import href="MARC21slimUtils.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="controlField008" select="marc:controlfield[@tag=008]"/>
19         <xsl:variable name="materialTypeCode">
20             <xsl:choose>
21                 <xsl:when test="$leader6='a'">
22                     <xsl:choose>
23                         <xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">BK</xsl:when>
24                         <xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">SE</xsl:when>
25                     </xsl:choose>
26                 </xsl:when>
27                 <xsl:when test="$leader6='t'">BK</xsl:when>
28                 <xsl:when test="$leader6='p'">MX</xsl:when>
29                 <xsl:when test="$leader6='m'">CF</xsl:when>
30                 <xsl:when test="$leader6='e' or $leader6='f'">MP</xsl:when>
31                 <xsl:when test="$leader6='g' or $leader6='k' or $leader6='o' or $leader6='r'">VM</xsl:when>
32                 <xsl:when test="$leader6='c' or $leader6='d' or $leader6='i' or $leader6='j'">MU</xsl:when>
33             </xsl:choose>
34         </xsl:variable>
35         <xsl:variable name="materialTypeLabel">
36             <xsl:choose>
37                 <xsl:when test="$leader6='a'">
38                     <xsl:choose>
39                         <xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">Book</xsl:when>
40                         <xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">Serial</xsl:when>
41                     </xsl:choose>
42                 </xsl:when>
43                 <xsl:when test="$leader6='t'">Book</xsl:when>
44                 <xsl:when test="$leader6='p'">Mixed Materials</xsl:when>
45                 <xsl:when test="$leader6='m'">Computer File</xsl:when>
46                 <xsl:when test="$leader6='e' or $leader6='f'">Map</xsl:when>
47                 <xsl:when test="$leader6='g' or $leader6='k' or $leader6='o' or $leader6='r'">Visual Material</xsl:when>
48                 <xsl:when test="$leader6='c' or $leader6='d' or $leader6='i' or $leader6='j'">Music</xsl:when>
49             </xsl:choose>
50         </xsl:variable>
51
52         <!-- Title Statement -->
53         <xsl:if test="marc:datafield[@tag=245]">
54         <h1>
55             <xsl:for-each select="marc:datafield[@tag=245]">
56                     <xsl:call-template name="subfieldSelect">
57                         <xsl:with-param name="codes">abfghk</xsl:with-param>
58                     </xsl:call-template>
59             </xsl:for-each>
60         </h1>
61         </xsl:if>
62
63         <xsl:choose>
64         <xsl:when test="marc:datafield[@tag=100] or marc:datafield[@tag=110] or marc:datafield[@tag=111] or marc:datafield[@tag=700] or marc:datafield[@tag=710] or marc:datafield[@tag=711]">
65
66         <h5 class="author">by
67         <xsl:for-each select="marc:datafield[@tag=100 or @tag=700]">
68         <a>
69         <xsl:choose>
70             <xsl:when test="marc:subfield[@code=9]">
71                 <xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=an:<xsl:value-of select="marc:subfield[@code=9]"/></xsl:attribute>
72             </xsl:when>
73             <xsl:otherwise>
74             <xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=au:<xsl:value-of select="marc:subfield[@code='a']"/></xsl:attribute>
75             </xsl:otherwise>
76         </xsl:choose>
77         <xsl:call-template name="nameABCDQ"/></a>
78         <xsl:choose>
79         <xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
80         </xsl:for-each>
81
82         <xsl:for-each select="marc:datafield[@tag=110 or @tag=710]">
83         <a>
84         <xsl:choose>
85             <xsl:when test="marc:subfield[@code=9]">
86                 <xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=an:<xsl:value-of select="marc:subfield[@code=9]"/></xsl:attribute>
87             </xsl:when>
88             <xsl:otherwise>
89             <xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=au:<xsl:value-of select="marc:subfield[@code='a']"/></xsl:attribute>      
90             </xsl:otherwise>
91         </xsl:choose>
92         <xsl:call-template name="nameABCDN"/></a>
93         <xsl:choose><xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
94         </xsl:for-each>
95
96         <xsl:for-each select="marc:datafield[@tag=111 or @tag=711]">
97         <a>
98         <xsl:choose>
99             <xsl:when test="marc:subfield[@code=9]">
100                 <xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=an:<xsl:value-of select="marc:subfield[@code=9]"/></xsl:attribute>
101             </xsl:when>
102             <xsl:otherwise>
103             <xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=au:<xsl:value-of select="marc:subfield[@code='a']"/></xsl:attribute>
104             </xsl:otherwise>
105         </xsl:choose>
106         <xsl:call-template name="nameACDEQ"/></a>
107         <xsl:choose><xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
108
109         </xsl:for-each>
110         </h5>
111         </xsl:when>
112         </xsl:choose>
113         <div id="views">
114         <span class="view"><span id="Normalview">Normal View</span> </span>
115         <span class="view"><a id="MARCviewPop" href="/cgi-bin/koha/opac-showmarc.pl?id={marc:datafield[@tag=999]/marc:subfield[@code='c']}" title="MARC" rel="gb_page_center[600,500]">MARC View</a></span>
116         <span class="view"><a id="MARCview" href="/cgi-bin/koha/opac-MARCdetail.pl?biblionumber={marc:datafield[@tag=999]/marc:subfield[@code='c']}" title="MARC">Expanded MARC View</a></span>
117         <span class="view"><a id="ISBDview" href="/cgi-bin/koha/opac-ISBDdetail.pl?biblionumber={marc:datafield[@tag=999]/marc:subfield[@code='c']}">Card View (ISBD)</a></span>
118         </div> 
119
120
121         <xsl:if test="$materialTypeCode">
122         <span class="results_summary"><span class="label">Type: </span>
123         <xsl:element name="img"><xsl:attribute name="src">/opac-tmpl/prog/famfamfam/<xsl:value-of select="$materialTypeCode"/>.png</xsl:attribute><xsl:attribute name="alt"></xsl:attribute></xsl:element>
124         <xsl:value-of select="$materialTypeLabel"/>
125         </span>
126         </xsl:if>
127         <xsl:if test="marc:datafield[@tag=440 or @tag=490]">
128         <span class="results_summary"><span class="label">Series: </span>
129         <xsl:for-each select="marc:datafield[@tag=440]">
130              <a href="/cgi-bin/koha/opac-search.pl?q=se:{marc:subfield[@code='a']}">
131             <xsl:call-template name="chopPunctuation">
132                             <xsl:with-param name="chopString">
133                                 <xsl:call-template name="subfieldSelect">
134                                     <xsl:with-param name="codes">av</xsl:with-param>
135                                 </xsl:call-template>
136                             </xsl:with-param>
137                         </xsl:call-template>
138                         </a>
139                     <xsl:text> </xsl:text><xsl:call-template name="part"/>
140             <xsl:choose><xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
141         </xsl:for-each>
142
143         <xsl:for-each select="marc:datafield[@tag=490][@ind1=0]">
144              <a href="/cgi-bin/koha/opac-search.pl?q=se:{marc:subfield[@code='a']}">
145                         <xsl:call-template name="chopPunctuation">
146                             <xsl:with-param name="chopString">
147                                 <xsl:call-template name="subfieldSelect">
148                                     <xsl:with-param name="codes">av</xsl:with-param>
149                                 </xsl:call-template>
150                             </xsl:with-param>
151                         </xsl:call-template>
152             </a>
153                     <xsl:call-template name="part"/>
154         <xsl:choose><xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
155         </xsl:for-each>
156         </span>
157         </xsl:if>
158         <xsl:if test="marc:datafield[@tag=260]">
159         <span class="results_summary"><span class="label">Publisher: </span>
160             <xsl:for-each select="marc:datafield[@tag=260]">
161                 <xsl:call-template name="chopPunctuation">
162                   <xsl:with-param name="chopString">
163                     <xsl:call-template name="subfieldSelect">
164                         <xsl:with-param name="codes">bcg</xsl:with-param>
165                     </xsl:call-template>
166                    </xsl:with-param>
167                </xsl:call-template>
168                     <xsl:choose><xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
169             </xsl:for-each>
170         </span> 
171         </xsl:if>
172         <xsl:if test="marc:datafield[@tag=020]">
173         <span class="results_summary"><span class="label">ISBN: </span>
174         <!-- unAPI <abbr/> tag -->
175         <xsl:for-each select="marc:datafield[@tag=020]">
176         <xsl:variable name="isbn" select="marc:subfield[@code='a']"/>
177         <abbr class="unapi-id" title="koha:isbn:{$isbn}"><xsl:value-of select="marc:subfield[@code='a']"/></abbr>
178                 <xsl:choose><xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
179         </xsl:for-each>
180         </span>
181         </xsl:if>
182
183         <xsl:if test="marc:datafield[@tag=022]">
184         <span class="results_summary"><span class="label">ISSN: </span>
185         <xsl:for-each select="marc:datafield[@tag=022]">
186                 <xsl:value-of select="marc:subfield[@code='a']"/>
187                 <xsl:choose><xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
188         </xsl:for-each>
189         </span>
190         </xsl:if>
191
192         <xsl:if test="marc:datafield[@tag=130]|marc:datafield[@tag=240]|marc:datafield[@tag=730][@ind2!=2]">
193         <span class="results_summary"><span class="label">Uniform titles: </span>
194         <xsl:for-each select="marc:datafield[@tag=130]|marc:datafield[@tag=240]|marc:datafield[@tag=730][@ind2!=2]">
195             <xsl:variable name="str">
196                 <xsl:for-each select="marc:subfield">
197                     <xsl:if test="(contains('adfklmor',@code) and (not(../marc:subfield[@code='n' or @code='p']) or (following-sibling::marc:subfield[@code='n' or @code='p'])))">
198                         <xsl:value-of select="text()"/>
199                         <xsl:text> </xsl:text>
200                      </xsl:if>
201                 </xsl:for-each>
202             </xsl:variable>
203             <xsl:call-template name="chopPunctuation">
204                 <xsl:with-param name="chopString">
205                     <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
206                         
207                 </xsl:with-param>
208             </xsl:call-template>
209             <xsl:choose><xsl:when test="position()=last()"><xsl:text>.</xsl:text></xsl:when><xsl:otherwise><xsl:text>; </xsl:text></xsl:otherwise></xsl:choose>
210         </xsl:for-each>
211         </span>
212         </xsl:if>
213
214         <xsl:if test="marc:datafield[@tag=650]">
215             <span class="results_summary"><span class="label">Related Subjects: </span>
216             <xsl:for-each select="marc:datafield[@tag=650]">
217             <a>
218             <xsl:choose>
219             <xsl:when test="marc:subfield[@code=9]">
220                 <xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=an:<xsl:value-of select="marc:subfield[@code=9]"/></xsl:attribute>
221             </xsl:when>
222             <xsl:otherwise>
223                 <xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=su:<xsl:value-of select="marc:subfield[@code='a']"/></xsl:attribute>
224             </xsl:otherwise>
225             </xsl:choose>
226             <xsl:call-template name="chopPunctuation">
227                 <xsl:with-param name="chopString">
228                     <xsl:call-template name="subfieldSelect">
229                         <xsl:with-param name="codes">abcdvxyz</xsl:with-param>
230                     </xsl:call-template>
231                 </xsl:with-param>
232             </xsl:call-template>
233             </a>
234             <xsl:choose>
235             <xsl:when test="position()=last()"></xsl:when>
236             <xsl:otherwise> | </xsl:otherwise>
237             </xsl:choose>
238
239             </xsl:for-each>
240             </span>
241         </xsl:if>
242
243         <xsl:if test="marc:datafield[@tag=856]">
244         <span class="results_summary"><span class="label">Online Resources: </span>
245         <xsl:for-each select="marc:datafield[@tag=856]">
246             <a><xsl:attribute name="href"><xsl:value-of select="marc:subfield[@code='u']"/></xsl:attribute>
247         <xsl:choose>
248             <xsl:when test="marc:subfield[@code='y' or @code='3' or @code='z']">
249                     <xsl:call-template name="subfieldSelect">
250                         <xsl:with-param name="codes">y3z</xsl:with-param>
251                     </xsl:call-template>
252             </xsl:when>
253         <xsl:when test="not(marc:subfield[@code='y']) and not(marc:subfield[@code='3']) and not(marc:subfield[@code='z'])">
254         Click here to access online
255         </xsl:when>
256         </xsl:choose>
257         </a>
258             <xsl:choose>
259             <xsl:when test="position()=last()"></xsl:when>
260             <xsl:otherwise> | </xsl:otherwise>
261             </xsl:choose>
262             
263         </xsl:for-each>
264         </span>
265         </xsl:if>
266         <xsl:if test="marc:datafield[@tag=505]">
267         <xsl:for-each select="marc:datafield[@tag=505]">
268         <span class="results_summary"><span class="label">
269         <xsl:choose>
270         <xsl:when test="@ind1=0">
271             Contents:
272         </xsl:when>
273         <xsl:when test="@ind1=1">
274             Incomplete contents:
275         </xsl:when>
276         <xsl:when test="@ind1=1">
277             Partial contents:
278         </xsl:when>
279         </xsl:choose>  
280         </span>
281         <xsl:choose>
282         <xsl:when test="@ind2=0">
283             <xsl:for-each select="marc:subfield[@code='t']">
284                 <xsl:value-of select="marc:subfield[@code=t]"/> <xsl:value-of select="marc:subfield[@code=r]"/>
285             </xsl:for-each> 
286         </xsl:when>
287         <xsl:otherwise>
288             <xsl:call-template name="subfieldSelect">
289                 <xsl:with-param name="codes">au</xsl:with-param>
290             </xsl:call-template>
291         </xsl:otherwise>
292         </xsl:choose>
293         </span>
294         </xsl:for-each>
295         </xsl:if>
296
297         <!-- 780 -->
298         <xsl:if test="marc:datafield[@tag=780]">
299         <xsl:for-each select="marc:datafield[@tag=780]">
300         <span class="results_summary"><span class="label">
301         <xsl:choose>
302         <xsl:when test="@ind2=0">
303             Continues:
304         </xsl:when>
305         <xsl:when test="@ind2=1">
306             Continues in part:
307         </xsl:when>
308         <xsl:when test="@ind2=2">
309             Supersedes:
310         </xsl:when>
311         <xsl:when test="@ind2=3">
312             Supersedes in part:
313         </xsl:when>
314         <xsl:when test="@ind2=4">
315             Formed by the union: ... and: ...
316         </xsl:when>
317         <xsl:when test="@ind2=5">
318             Absorbed:
319         </xsl:when>
320         <xsl:when test="@ind2=6">
321             Absorbed in part:
322         </xsl:when>
323         <xsl:when test="@ind2=7">
324             Separated from:
325         </xsl:when>
326         </xsl:choose>
327         </span>
328                 <xsl:variable name="f780">
329                     <xsl:call-template name="subfieldSelect">
330                         <xsl:with-param name="codes">at</xsl:with-param>
331                     </xsl:call-template>
332                 </xsl:variable>
333              <a><xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=<xsl:value-of select="translate($f780, '()', '')"/></xsl:attribute>
334                 <xsl:value-of select="translate($f780, '()', '')"/>
335             </a>
336         </span>
337  
338         <xsl:choose>
339         <xsl:when test="@ind1=0">
340             <span class="results_summary"><xsl:value-of select="marc:subfield[@code='n']"/></span>
341         </xsl:when>
342         </xsl:choose>
343
344         </xsl:for-each>
345         </xsl:if>
346
347         <!-- 785 -->
348         <xsl:if test="marc:datafield[@tag=785]">
349         <xsl:for-each select="marc:datafield[@tag=785]">
350         <span class="results_summary"><span class="label">
351         <xsl:choose>
352         <xsl:when test="@ind2=0">
353             Continued by:
354         </xsl:when>
355         <xsl:when test="@ind2=1">
356             Continued in part by:
357         </xsl:when>
358         <xsl:when test="@ind2=2">
359             Superseded by:
360         </xsl:when>
361         <xsl:when test="@ind2=3">
362             Superseded in part by:
363         </xsl:when>
364         <xsl:when test="@ind2=4">
365             Absorbed by:
366         </xsl:when>
367         <xsl:when test="@ind2=5">
368             Absorbed in part by:
369         </xsl:when>
370         <xsl:when test="@ind2=6">
371             Split into .. and ...:
372         </xsl:when>
373         <xsl:when test="@ind2=7">
374             Merged with ... to form ...
375         </xsl:when>
376         <xsl:when test="@ind2=8">
377             Changed back to:
378         </xsl:when>
379
380         </xsl:choose>
381         </span>
382                    <xsl:variable name="f785">
383                     <xsl:call-template name="subfieldSelect">
384                         <xsl:with-param name="codes">at</xsl:with-param>
385                     </xsl:call-template>
386                 </xsl:variable>
387
388                 <a><xsl:attribute name="href">/cgi-bin/koha/opac-search.pl?q=<xsl:value-of select="translate($f785, '()', '')"/></xsl:attribute>
389                 <xsl:value-of select="translate($f785, '()', '')"/>
390             </a>
391
392         </span>
393         </xsl:for-each>
394         </xsl:if>
395
396     </xsl:template>
397
398     <xsl:template name="nameABCDQ">
399             <xsl:call-template name="chopPunctuation">
400                 <xsl:with-param name="chopString">
401                     <xsl:call-template name="subfieldSelect">
402                         <xsl:with-param name="codes">aq</xsl:with-param>
403                     </xsl:call-template>
404                 </xsl:with-param>
405                 <xsl:with-param name="punctuation">
406                     <xsl:text>:,;/ </xsl:text>
407                 </xsl:with-param>
408             </xsl:call-template>
409         <xsl:call-template name="termsOfAddress"/>
410     </xsl:template>
411
412     <xsl:template name="nameABCDN">
413         <xsl:for-each select="marc:subfield[@code='a']">
414                 <xsl:call-template name="chopPunctuation">
415                     <xsl:with-param name="chopString" select="."/>
416                 </xsl:call-template>
417         </xsl:for-each>
418         <xsl:for-each select="marc:subfield[@code='b']">
419                 <xsl:value-of select="."/>
420         </xsl:for-each>
421         <xsl:if test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
422                 <xsl:call-template name="subfieldSelect">
423                     <xsl:with-param name="codes">cdn</xsl:with-param>
424                 </xsl:call-template>
425         </xsl:if>
426     </xsl:template>
427
428     <xsl:template name="nameACDEQ">
429             <xsl:call-template name="subfieldSelect">
430                 <xsl:with-param name="codes">acdeq</xsl:with-param>
431             </xsl:call-template>
432     </xsl:template>
433     <xsl:template name="termsOfAddress">
434         <xsl:if test="marc:subfield[@code='b' or @code='c']">
435             <xsl:call-template name="chopPunctuation">
436                 <xsl:with-param name="chopString">
437                     <xsl:call-template name="subfieldSelect">
438                         <xsl:with-param name="codes">bc</xsl:with-param>
439                     </xsl:call-template>
440                 </xsl:with-param>
441             </xsl:call-template>
442         </xsl:if>
443     </xsl:template>
444
445     <xsl:template name="part">
446         <xsl:variable name="partNumber">
447             <xsl:call-template name="specialSubfieldSelect">
448                 <xsl:with-param name="axis">n</xsl:with-param>
449                 <xsl:with-param name="anyCodes">n</xsl:with-param>
450                 <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
451             </xsl:call-template>
452         </xsl:variable>
453         <xsl:variable name="partName">
454             <xsl:call-template name="specialSubfieldSelect">
455                 <xsl:with-param name="axis">p</xsl:with-param>
456                 <xsl:with-param name="anyCodes">p</xsl:with-param>
457                 <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
458             </xsl:call-template>
459         </xsl:variable>
460         <xsl:if test="string-length(normalize-space($partNumber))">
461                 <xsl:call-template name="chopPunctuation">
462                     <xsl:with-param name="chopString" select="$partNumber"/>
463                 </xsl:call-template>
464         </xsl:if>
465         <xsl:if test="string-length(normalize-space($partName))">
466                 <xsl:call-template name="chopPunctuation">
467                     <xsl:with-param name="chopString" select="$partName"/>
468                 </xsl:call-template>
469         </xsl:if>
470     </xsl:template>
471
472     <xsl:template name="specialSubfieldSelect">
473         <xsl:param name="anyCodes"/>
474         <xsl:param name="axis"/>
475         <xsl:param name="beforeCodes"/>
476         <xsl:param name="afterCodes"/>
477         <xsl:variable name="str">
478             <xsl:for-each select="marc:subfield">
479                 <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])">
480                     <xsl:value-of select="text()"/>
481                     <xsl:text> </xsl:text>
482                 </xsl:if>
483             </xsl:for-each>
484         </xsl:variable>
485         <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
486     </xsl:template>
487 </xsl:stylesheet>