Experimental XSLT-based display of results and details pages To enable, create two...
[koha.git] / koha-tmpl / opac-tmpl / prog / en / xslt / MARC21slim2OPACResults.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="html" indent="yes"/>
10     <xsl:key name="item-by-status" match="items:item" use="items:status"/>
11     <xsl:key name="item-by-status-and-branch" match="items:item" use="concat(items:status, ' ', items:homebranch)"/>
12
13     <xsl:template match="/">
14             <xsl:apply-templates/>
15     </xsl:template>
16     <xsl:template match="marc:record">
17         <xsl:variable name="leader" select="marc:leader"/>
18         <xsl:variable name="leader6" select="substring($leader,7,1)"/>
19         <xsl:variable name="leader7" select="substring($leader,8,1)"/>
20         <xsl:variable name="controlField008" select="marc:controlfield[@tag=008]"/>
21         <xsl:variable name="materialTypeCode">
22             <xsl:choose>
23                 <xsl:when test="$leader6='a'">
24                     <xsl:choose>
25                         <xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">BK</xsl:when>
26                         <xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">SE</xsl:when>
27                     </xsl:choose>
28                 </xsl:when>
29                 <xsl:when test="$leader6='t'">BK</xsl:when>
30                 <xsl:when test="$leader6='p'">MM</xsl:when>
31                 <xsl:when test="$leader6='m'">CF</xsl:when>
32                 <xsl:when test="$leader6='e' or $leader6='f'">MP</xsl:when>
33                 <xsl:when test="$leader6='g' or $leader6='k' or $leader6='o' or $leader6='r'">VM</xsl:when>
34                 <xsl:when test="$leader6='c' or $leader6='d' or $leader6='i' or $leader6='j'">MU</xsl:when>
35             </xsl:choose>
36         </xsl:variable>
37         <xsl:variable name="materialTypeLabel">
38             <xsl:choose>
39                 <xsl:when test="$leader6='a'">
40                     <xsl:choose>
41                         <xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">Book</xsl:when>
42                         <xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">Serial</xsl:when>
43                     </xsl:choose>
44                 </xsl:when>
45                 <xsl:when test="$leader6='t'">Book</xsl:when>
46                 <xsl:when test="$leader6='p'">Mixed Materials</xsl:when>
47                 <xsl:when test="$leader6='m'">Computer File</xsl:when>
48                 <xsl:when test="$leader6='e' or $leader6='f'">Map</xsl:when>
49                 <xsl:when test="$leader6='g' or $leader6='k' or $leader6='o' or $leader6='r'">Visual Material</xsl:when>
50                 <xsl:when test="$leader6='c' or $leader6='d' or $leader6='i' or $leader6='j'">Music</xsl:when>
51             </xsl:choose>
52         </xsl:variable>
53
54 <style type="text/css">
55     .results_summary {
56         font-size: 80%;
57         color: grey;
58     }
59     .select {
60         border-bottom: 1px solid #ddd; padding: 6px 5px; vertical-align: top;
61     }
62     .holdings_summary {
63         font-size: 90%;
64     }
65 </style>
66
67     <td class="select">
68 <input  type="checkbox" id="bib{marc:datafield[@tag=999]/marc:subfield[@code='c']}" name="biblionumber" value="{marc:datafield[@tag=999]/marc:subfield[@code='c']}" title="Click to add to cart" /> <label for="bib{marc:datafield[@tag=999]/marc:subfield[@code='c']}"></label>
69     </td>
70     <td>
71      <a><xsl:attribute name="href">/cgi-bin/koha/opac-detail.pl?biblionumber=<xsl:value-of select="marc:datafield[@tag=999]/marc:subfield[@code='c']"/></xsl:attribute>
72
73         <xsl:if test="marc:datafield[@tag=245]">
74         <xsl:for-each select="marc:datafield[@tag=245]">
75             <xsl:variable name="title">
76                 <xsl:choose>
77                 <xsl:when test="marc:subfield[@code='b']">
78                     <xsl:call-template name="specialSubfieldSelect">
79                         <xsl:with-param name="axis">b</xsl:with-param>
80                         <xsl:with-param name="beforeCodes">afghk</xsl:with-param>
81                     </xsl:call-template>
82                 </xsl:when>
83                 <xsl:otherwise>
84                 <xsl:call-template name="subfieldSelect">
85                     <xsl:with-param name="codes">abfgk</xsl:with-param>
86                 </xsl:call-template>
87                 </xsl:otherwise>
88                 </xsl:choose>
89             </xsl:variable>
90             <xsl:variable name="titleChop">
91                 <xsl:call-template name="chopPunctuation">
92                     <xsl:with-param name="chopString">
93                         <xsl:value-of select="$title"/>
94                     </xsl:with-param>
95                 </xsl:call-template>
96             </xsl:variable>
97             <xsl:value-of select="$titleChop"/>
98             <xsl:if test="marc:subfield[@code='b']">
99                 <xsl:text> : </xsl:text>
100                 <xsl:call-template name="chopPunctuation">
101                     <xsl:with-param name="chopString">
102                         <xsl:call-template name="specialSubfieldSelect">
103                             <xsl:with-param name="axis">b</xsl:with-param>
104                             <xsl:with-param name="anyCodes">b</xsl:with-param>
105                             <xsl:with-param name="afterCodes">afghk</xsl:with-param>
106                         </xsl:call-template>
107                     </xsl:with-param>
108                 </xsl:call-template>
109             </xsl:if>
110             <xsl:call-template name="part"/>
111         </xsl:for-each>.
112         </xsl:if>
113     </a>
114     <p>
115
116     <xsl:choose>
117     <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]">
118
119     by 
120         <xsl:for-each select="marc:datafield[@tag=100 or @tag=700]">
121             <xsl:choose>
122             <xsl:when test="position()=last()">
123                 <xsl:call-template name="nameABCDQ"/>.
124             </xsl:when>
125             <xsl:otherwise>
126                 <xsl:call-template name="nameABCDQ"/>;
127             </xsl:otherwise>
128             </xsl:choose>
129         </xsl:for-each>
130
131         <xsl:for-each select="marc:datafield[@tag=110 or @tag=710]">
132             <xsl:choose>
133             <xsl:when test="position()=last()">
134                 <xsl:call-template name="nameABCDN"/>.
135             </xsl:when>
136             <xsl:otherwise>
137                 <xsl:call-template name="nameABCDN"/>;
138             </xsl:otherwise>
139             </xsl:choose>
140         </xsl:for-each>
141
142         <xsl:for-each select="marc:datafield[@tag=111 or @tag=711]">
143             <xsl:choose>
144             <xsl:when test="position()=last()">
145                 <xsl:call-template name="nameACDEQ"/>.
146             </xsl:when>
147             <xsl:otherwise>
148                 <xsl:call-template name="nameACDEQ"/>;
149             </xsl:otherwise>
150             </xsl:choose>
151         </xsl:for-each>
152
153     </xsl:when>
154     </xsl:choose>
155     </p>
156     <span class="results_summary">
157     <xsl:if test="$materialTypeCode">
158     <span class="label">Type: </span>
159     <img src="/opac-tmpl/prog/famfamfam/{$materialTypeCode}.png"/><xsl:value-of select="$materialTypeLabel"/><br/>
160     </xsl:if>
161     <xsl:if test="marc:datafield[@tag=260]">
162     <span class="label">Publisher: </span> 
163             <xsl:for-each select="marc:datafield[@tag=260]">
164                     <xsl:call-template name="subfieldSelect">
165                         <xsl:with-param name="codes">bcg</xsl:with-param>
166                     </xsl:call-template>
167             </xsl:for-each>
168
169     </xsl:if>
170     </span>
171                <div class="holdings_summary">
172                    <xsl:if test="count(key('item-by-status', 'available'))>0">
173                    <span class="available">
174                        <xsl:text>Copies available at: </xsl:text>
175                        <xsl:variable name="available_items"
176                            select="key('item-by-status', 'available')"/>
177                        <xsl:for-each select="$available_items[generate-id() = generate-id(key('item-by-status-and-branch', concat(items:status, ' ', items:homebranch))[1])]">
178                            <xsl:value-of select="items:homebranch"/>
179                            <xsl:text> (</xsl:text>
180                            <xsl:value-of select="count(key('item-by-status-and-branch', concat(items:status, ' ', items:homebranch)))"/>
181                            <xsl:text>) </xsl:text>
182                        </xsl:for-each>
183                    </span>
184                    </xsl:if>
185                    <xsl:if test="count(key('item-by-status', 'On loan'))>0">
186                    <span class="unavailable">
187                        <xsl:text>On loan (</xsl:text>
188                        <xsl:value-of select="count(key('item-by-status', 'On loan'))"/>
189                        <xsl:text>)</xsl:text>
190                    </span>
191                    </xsl:if>
192                </div>
193     </td>
194     </xsl:template>
195     <xsl:template name="nameABCDQ">
196             <xsl:call-template name="chopPunctuation">
197                 <xsl:with-param name="chopString">
198                     <xsl:call-template name="subfieldSelect">
199                         <xsl:with-param name="codes">aq</xsl:with-param>
200                     </xsl:call-template>
201                 </xsl:with-param>
202                 <xsl:with-param name="punctuation">
203                     <xsl:text>:,;/ </xsl:text>
204                 </xsl:with-param>
205             </xsl:call-template>
206         <xsl:call-template name="termsOfAddress"/>
207     </xsl:template>
208
209     <xsl:template name="nameABCDN">
210         <xsl:for-each select="marc:subfield[@code='a']">
211                 <xsl:call-template name="chopPunctuation">
212                     <xsl:with-param name="chopString" select="."/>
213                 </xsl:call-template>
214         </xsl:for-each>
215         <xsl:for-each select="marc:subfield[@code='b']">
216                 <xsl:value-of select="."/>
217         </xsl:for-each>
218         <xsl:if test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
219                 <xsl:call-template name="subfieldSelect">
220                     <xsl:with-param name="codes">cdn</xsl:with-param>
221                 </xsl:call-template>
222         </xsl:if>
223     </xsl:template>
224
225     <xsl:template name="nameACDEQ">
226             <xsl:call-template name="subfieldSelect">
227                 <xsl:with-param name="codes">acdeq</xsl:with-param>
228             </xsl:call-template>
229     </xsl:template>
230
231     <xsl:template name="termsOfAddress">
232         <xsl:if test="marc:subfield[@code='b' or @code='c']">
233             <xsl:call-template name="chopPunctuation">
234                 <xsl:with-param name="chopString">
235                     <xsl:call-template name="subfieldSelect">
236                         <xsl:with-param name="codes">bc</xsl:with-param>
237                     </xsl:call-template>
238                 </xsl:with-param>
239             </xsl:call-template>
240         </xsl:if>
241     </xsl:template>
242
243     <xsl:template name="nameDate">
244         <xsl:for-each select="marc:subfield[@code='d']">
245             <xsl:call-template name="chopPunctuation">
246                 <xsl:with-param name="chopString" select="."/>
247             </xsl:call-template>
248         </xsl:for-each>
249     </xsl:template>
250
251     <xsl:template name="role">
252         <xsl:for-each select="marc:subfield[@code='e']">
253                     <xsl:value-of select="."/>
254         </xsl:for-each>
255         <xsl:for-each select="marc:subfield[@code='4']">
256                     <xsl:value-of select="."/>
257         </xsl:for-each>
258     </xsl:template>
259
260     <xsl:template name="specialSubfieldSelect">
261         <xsl:param name="anyCodes"/>
262         <xsl:param name="axis"/>
263         <xsl:param name="beforeCodes"/>
264         <xsl:param name="afterCodes"/>
265         <xsl:variable name="str">
266             <xsl:for-each select="marc:subfield">
267                 <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])">
268                     <xsl:value-of select="text()"/>
269                     <xsl:text> </xsl:text>
270                 </xsl:if>
271             </xsl:for-each>
272         </xsl:variable>
273         <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
274     </xsl:template>
275
276     <xsl:template name="subtitle">
277         <xsl:if test="marc:subfield[@code='b']">
278                 <xsl:call-template name="chopPunctuation">
279                     <xsl:with-param name="chopString">
280                         <xsl:value-of select="marc:subfield[@code='b']"/>
281
282                         <!--<xsl:call-template name="subfieldSelect">
283                             <xsl:with-param name="codes">b</xsl:with-param>                                 
284                         </xsl:call-template>-->
285                     </xsl:with-param>
286                 </xsl:call-template>
287         </xsl:if>
288     </xsl:template>
289
290     <xsl:template name="part">
291         <xsl:variable name="partNumber">
292             <xsl:call-template name="specialSubfieldSelect">
293                 <xsl:with-param name="axis">n</xsl:with-param>
294                 <xsl:with-param name="anyCodes">n</xsl:with-param>
295                 <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
296             </xsl:call-template>
297         </xsl:variable>
298         <xsl:variable name="partName">
299             <xsl:call-template name="specialSubfieldSelect">
300                 <xsl:with-param name="axis">p</xsl:with-param>
301                 <xsl:with-param name="anyCodes">p</xsl:with-param>
302                 <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
303             </xsl:call-template>
304         </xsl:variable>
305         <xsl:if test="string-length(normalize-space($partNumber))">
306                 <xsl:call-template name="chopPunctuation">
307                     <xsl:with-param name="chopString" select="$partNumber"/>
308                 </xsl:call-template>
309         </xsl:if>
310         <xsl:if test="string-length(normalize-space($partName))">
311         <xsl:if test="string-length(normalize-space($partName))">
312                 <xsl:call-template name="chopPunctuation">
313                     <xsl:with-param name="chopString" select="$partName"/>
314                 </xsl:call-template>
315         </xsl:if>
316     </xsl:template>
317
318 </xsl:stylesheet>