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