Bug 14716: URI-encode URLs in UNIMARC xsl templates.
[koha.git] / koha-tmpl / intranet-tmpl / prog / en / xslt / UNIMARCslimUtils.xsl
1 <?xml version='1.0'?>
2
3 <!DOCTYPE stylesheet [<!ENTITY nbsp "&#160;" >]>
4
5 <xsl:stylesheet version="1.0"
6   xmlns:marc="http://www.loc.gov/MARC21/slim"
7   xmlns:items="http://www.koha-community.org/items"
8   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
9   xmlns:str="http://exslt.org/strings"
10   exclude-result-prefixes="marc items str">
11
12   <xsl:template name="datafield">
13     <xsl:param name="tag"/>
14     <xsl:param name="ind1"><xsl:text> </xsl:text></xsl:param>
15     <xsl:param name="ind2"><xsl:text> </xsl:text></xsl:param>
16     <xsl:param name="subfields"/>
17     <xsl:element name="datafield">
18       <xsl:attribute name="tag">
19         <xsl:value-of select="$tag"/>
20       </xsl:attribute>
21       <xsl:attribute name="ind1">
22         <xsl:value-of select="$ind1"/>
23       </xsl:attribute>
24       <xsl:attribute name="ind2">
25        <xsl:value-of select="$ind2"/>
26          </xsl:attribute>
27        <xsl:copy-of select="$subfields"/>
28     </xsl:element>
29   </xsl:template>
30
31   <xsl:template name="tag_210">
32     <li>
33       <strong>Publication: </strong>
34       <xsl:for-each select="marc:datafield[@tag=210]">
35         <span>
36           <xsl:call-template name="addClassRtl" />
37           <xsl:value-of select="marc:subfield[@code='a']"/>
38           <xsl:if test="marc:subfield[@code='b']">
39             <xsl:if test="marc:subfield[@code='a']">, </xsl:if>
40             <xsl:value-of select="marc:subfield[@code='b']"/>
41           </xsl:if>
42           <xsl:if test="marc:subfield[@code='a' or @code='b']">
43             <xsl:if test="marc:subfield[@code='a']"> : </xsl:if>
44             <xsl:value-of select="marc:subfield[@code='c']"/>
45           </xsl:if>
46           <xsl:if test="marc:subfield[@code='d']">
47             <xsl:if test="marc:subfield[@code='a' or @code='c']">, </xsl:if>
48             <xsl:value-of select="marc:subfield[@code='d']"/>
49           </xsl:if>
50           <xsl:if test="marc:subfield[@code='e']">
51             <xsl:if test="marc:subfield[@code='a' or @code='c' or @code='d']"> — </xsl:if>
52             <xsl:value-of select="marc:subfield[@code='e']"/>
53           </xsl:if>
54           <xsl:if test="marc:subfield[@code='g']">
55             <xsl:if test="marc:subfield[@code='e']"> : </xsl:if>
56             <xsl:value-of select="marc:subfield[@code='g']"/>
57           </xsl:if>
58           <xsl:if test="marc:subfield[@code='h']">
59             <xsl:if test="marc:subfield[@code='e' or @code='g']">, </xsl:if>
60             <xsl:value-of select="marc:subfield[@code='h']"/>
61           </xsl:if>
62           <xsl:if test="not (position() = last())">
63             <xsl:text> • </xsl:text>
64           </xsl:if>
65         </span>
66       </xsl:for-each>
67     </li>
68   </xsl:template>
69
70         <xsl:template name="tag_215">
71     <xsl:for-each select="marc:datafield[@tag=215]">
72       <li>
73         <strong>Description: </strong>
74         <xsl:if test="marc:subfield[@code='a']">
75           <xsl:value-of select="marc:subfield[@code='a']"/>
76         </xsl:if>
77         <xsl:if test="marc:subfield[@code='c']"> :
78           <xsl:value-of select="marc:subfield[@code='c']"/>
79         </xsl:if>
80         <xsl:if test="marc:subfield[@code='d']"> ;
81           <xsl:value-of select="marc:subfield[@code='d']"/>
82         </xsl:if>
83         <xsl:if test="marc:subfield[@code='e']"> +
84           <xsl:value-of select="marc:subfield[@code='e']"/>
85         </xsl:if>
86       </li>
87     </xsl:for-each>
88   </xsl:template>
89
90         <xsl:template name="tag_4xx">
91     <xsl:for-each select="marc:datafield[@tag=464 or @tag=461]">
92         <li>
93         <strong>Linked with: </strong>
94         <span>
95           <xsl:call-template name="addClassRtl" />
96           <xsl:if test="marc:subfield[@code='t']">
97             <xsl:value-of select="marc:subfield[@code='t']"/>
98           </xsl:if>
99           <xsl:if test="marc:subfield[@code='e']"> :
100             <xsl:value-of select="marc:subfield[@code='e']"/>
101           </xsl:if>
102           <xsl:if test="marc:subfield[@code='f']"> /
103             <xsl:value-of select="marc:subfield[@code='f']"/>
104           </xsl:if>
105           <xsl:if test="marc:subfield[@code='v']">,
106             <xsl:value-of select="marc:subfield[@code='v']"/>
107           </xsl:if>
108         </span>
109       </li>
110     </xsl:for-each>
111   </xsl:template>
112
113         <xsl:template name="subfieldSelect">
114                 <xsl:param name="codes"/>
115                 <xsl:param name="delimeter"><xsl:text> </xsl:text></xsl:param>
116                 <xsl:param name="subdivCodes"/>
117                 <xsl:param name="subdivDelimiter"/>
118                 <xsl:variable name="str">
119                         <xsl:for-each select="marc:subfield">
120                                 <xsl:if test="contains($codes, @code)">
121                     <xsl:if test="contains($subdivCodes, @code)">
122                         <xsl:value-of select="$subdivDelimiter"/>
123                     </xsl:if>
124                                         <xsl:value-of select="text()"/><xsl:value-of select="$delimeter"/>
125                                 </xsl:if>
126                         </xsl:for-each>
127                 </xsl:variable>
128                 <xsl:value-of select="substring($str,1,string-length($str)-string-length($delimeter))"/>
129         </xsl:template>
130
131         <xsl:template name="buildSpaces">
132                 <xsl:param name="spaces"/>
133                 <xsl:param name="char"><xsl:text> </xsl:text></xsl:param>
134                 <xsl:if test="$spaces>0">
135                         <xsl:value-of select="$char"/>
136                         <xsl:call-template name="buildSpaces">
137                                 <xsl:with-param name="spaces" select="$spaces - 1"/>
138                                 <xsl:with-param name="char" select="$char"/>
139                         </xsl:call-template>
140                 </xsl:if>
141         </xsl:template>
142
143   <xsl:template name="buildBiblioDefaultViewURL">
144       <xsl:param name="IntranetBiblioDefaultView"/>
145       <xsl:choose>
146           <xsl:when test="$IntranetBiblioDefaultView='normal'">
147               <xsl:text>/cgi-bin/koha/catalogue/detail.pl?biblionumber=</xsl:text>
148           </xsl:when>
149           <xsl:when test="$IntranetBiblioDefaultView='isbd'">
150               <xsl:text>/cgi-bin/koha/catalogue/ISBDdetail.pl?biblionumber=</xsl:text>
151           </xsl:when>
152           <xsl:when test="$IntranetBiblioDefaultView='labeled_marc'">
153               <xsl:text>/cgi-bin/koha/catalogue/labeledMARCdetail.pl?biblionumber=</xsl:text>
154           </xsl:when>
155           <xsl:when test="$IntranetBiblioDefaultView='marc'">
156               <xsl:text>/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=</xsl:text>
157           </xsl:when>
158           <xsl:otherwise>
159               <xsl:text>/cgi-bin/koha/catalogue/detail.pl?biblionumber=</xsl:text>
160           </xsl:otherwise>
161       </xsl:choose>
162   </xsl:template>
163
164         <xsl:template name="chopSpecialCharacters">
165         <xsl:param name="title" />
166         <xsl:variable name="ntitle"
167              select="translate($title, '&#x0098;&#x009C;&#xC29C;&#xC29B;&#xC298;&#xC288;&#xC289;','')"/>
168         <xsl:value-of select="$ntitle" />
169     </xsl:template>
170
171
172         <xsl:template name="chopPunctuation">
173                 <xsl:param name="chopString"/>
174                 <xsl:variable name="length" select="string-length($chopString)"/>
175                 <xsl:choose>
176                         <xsl:when test="$length=0"/>
177                         <xsl:when test="contains('.:,;/ ', substring($chopString,$length,1))">
178                                 <xsl:call-template name="chopPunctuation">
179                                         <xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
180                                 </xsl:call-template>
181                         </xsl:when>
182                         <xsl:when test="not($chopString)"/>
183                         <xsl:otherwise><xsl:value-of select="$chopString"/></xsl:otherwise>
184                 </xsl:choose>
185     <xsl:text> </xsl:text>
186         </xsl:template>
187
188         <xsl:template name="addClassRtl">
189     <xsl:variable name="lang" select="marc:subfield[@code='7']" />
190     <xsl:if test="$lang = 'ha' or $lang = 'Hebrew' or $lang = 'fa' or $lang = 'Arabe'">
191       <xsl:attribute name="class">rtl</xsl:attribute>
192     </xsl:if>
193   </xsl:template>
194
195   <xsl:template name="tag_title">
196     <xsl:param name="tag" />
197     <xsl:param name="label" />
198     <xsl:if test="marc:datafield[@tag=$tag]">
199       <li>
200         <strong><xsl:value-of select="$label"/>: </strong>
201         <xsl:for-each select="marc:datafield[@tag=$tag]">
202           <xsl:value-of select="marc:subfield[@code='a']" />
203           <xsl:if test="marc:subfield[@code='d']">
204             <xsl:text> : </xsl:text>
205             <xsl:value-of select="marc:subfield[@code='e']"/>
206           </xsl:if>
207           <xsl:if test="marc:subfield[@code='e']">
208             <xsl:for-each select="marc:subfield[@code='e']">
209               <xsl:text> </xsl:text>
210               <xsl:value-of select="."/>
211             </xsl:for-each>
212           </xsl:if>
213           <xsl:if test="marc:subfield[@code='f']">
214             <xsl:text> / </xsl:text>
215             <xsl:value-of select="marc:subfield[@code='f']"/>
216           </xsl:if>
217           <xsl:if test="marc:subfield[@code='h']">
218             <xsl:text>, </xsl:text>
219             <xsl:value-of select="marc:subfield[@code='h']"/>
220           </xsl:if>
221           <xsl:if test="marc:subfield[@code='i']">
222             <xsl:text>, </xsl:text>
223             <xsl:value-of select="marc:subfield[@code='i']"/>
224           </xsl:if>
225           <xsl:if test="marc:subfield[@code='v']">
226             <xsl:text>, </xsl:text>
227             <xsl:value-of select="marc:subfield[@code='v']"/>
228           </xsl:if>
229           <xsl:if test="marc:subfield[@code='x']">
230             <xsl:text>, </xsl:text>
231             <xsl:value-of select="marc:subfield[@code='x']"/>
232           </xsl:if>
233           <xsl:if test="marc:subfield[@code='z']">
234             <xsl:text>, </xsl:text>
235             <xsl:value-of select="marc:subfield[@code='z']"/>
236           </xsl:if>
237         </xsl:for-each>
238       </li>
239     </xsl:if>
240   </xsl:template>
241
242
243   <xsl:template name="tag_subject">
244     <xsl:param name="tag" />
245     <xsl:param name="label" />
246     <xsl:if test="marc:datafield[@tag=$tag]">
247       <li>
248         <strong><xsl:value-of select="$label"/>: </strong>
249         <xsl:for-each select="marc:datafield[@tag=$tag]">
250           <a>
251             <xsl:choose>
252               <xsl:when test="marc:subfield[@code=9]">
253                 <xsl:attribute name="href">/cgi-bin/koha/catalogue/search.pl?q=an:<xsl:value-of select="marc:subfield[@code=9]"/></xsl:attribute>
254               </xsl:when>
255               <xsl:otherwise>
256                 <xsl:attribute name="href">/cgi-bin/koha/catalogue/search.pl?q=su:<xsl:value-of select="str:encode-uri(marc:subfield[@code='a'], true())"/></xsl:attribute>
257               </xsl:otherwise>
258             </xsl:choose>
259             <xsl:call-template name="chopPunctuation">
260               <xsl:with-param name="chopString">
261                 <xsl:call-template name="subfieldSelect">
262                     <xsl:with-param name="codes">abcdjpvxyz</xsl:with-param>
263                     <xsl:with-param name="subdivCodes">jpxyz</xsl:with-param>
264                     <xsl:with-param name="subdivDelimiter">-- </xsl:with-param>
265                 </xsl:call-template>
266               </xsl:with-param>
267             </xsl:call-template>
268           </a>
269           <xsl:if test="not (position()=last())">
270             <xsl:text> | </xsl:text>
271           </xsl:if>
272         </xsl:for-each>
273       </li>
274     </xsl:if>
275   </xsl:template>
276
277
278   <xsl:template name="tag_7xx">
279     <xsl:param name="tag" />
280     <xsl:param name="label" />
281     <xsl:if test="marc:datafield[@tag=$tag]">
282       <li>
283         <strong><xsl:value-of select="$label" />: </strong>
284         <xsl:for-each select="marc:datafield[@tag=$tag]">
285           <span>
286             <xsl:call-template name="addClassRtl" />
287             <a>
288               <xsl:choose>
289                 <xsl:when test="marc:subfield[@code=9]">
290                   <xsl:attribute name="href">/cgi-bin/koha/catalogue/search.pl?q=an:<xsl:value-of select="marc:subfield[@code=9]"/></xsl:attribute>
291                 </xsl:when>
292                 <xsl:otherwise>
293                   <xsl:attribute name="href">/cgi-bin/koha/catalogue/search.pl?q=au:<xsl:value-of select="str:encode-uri(marc:subfield[@code='a'], true())"/><xsl:text> </xsl:text><xsl:value-of select="marc:subfield[@code='b']"/></xsl:attribute>
294                 </xsl:otherwise>
295               </xsl:choose>
296               <xsl:if test="marc:subfield[@code='a']">
297                 <xsl:value-of select="marc:subfield[@code='a']"/>
298               </xsl:if>
299               <xsl:if test="marc:subfield[@code='b']">
300                 <xsl:text>, </xsl:text>
301                 <xsl:value-of select="marc:subfield[@code='b']"/>
302               </xsl:if>
303               <xsl:if test="marc:subfield[@code='c']">
304                 <xsl:text>, </xsl:text>
305                 <xsl:value-of select="marc:subfield[@code='c']"/>
306               </xsl:if>
307               <xsl:if test="marc:subfield[@code='d']">
308                 <xsl:text> </xsl:text>
309                 <xsl:value-of select="marc:subfield[@code='d']"/>
310               </xsl:if>
311               <xsl:if test="marc:subfield[@code='f']">
312                 <span dir="ltr">
313                 <xsl:text> (</xsl:text>
314                 <xsl:value-of select="marc:subfield[@code='f']"/>
315                 <xsl:text>)</xsl:text>
316                 </span>
317               </xsl:if>
318               <xsl:if test="marc:subfield[@code='g']">
319                 <xsl:text> </xsl:text>
320                 <xsl:value-of select="marc:subfield[@code='g']"/>
321               </xsl:if>
322               <xsl:if test="marc:subfield[@code='p']">
323                 <xsl:text> </xsl:text>
324                 <xsl:value-of select="marc:subfield[@code='p']"/>
325               </xsl:if>
326             </a>
327           </span>
328           <xsl:if test="not (position() = last())">
329             <xsl:text> ; </xsl:text>
330           </xsl:if>
331         </xsl:for-each>
332       </li>
333     </xsl:if>
334   </xsl:template>
335
336 </xsl:stylesheet>