Removed collection tag. Removed(Outcommented) mergekey as in marc21.xsl
[pazpar2-moved-to-github.git] / etc / marc21.xsl
1 <?xml version="1.0" encoding="UTF-8"?>
2 <xsl:stylesheet
3     version="1.0"
4     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
5     xmlns:pz="http://www.indexdata.com/pazpar2/1.0"
6     xmlns:marc="http://www.loc.gov/MARC21/slim">
7   
8   <xsl:output indent="yes" method="xml" version="1.0" encoding="UTF-8"/>
9
10 <!-- Extract metadata from MARC21/USMARC 
11       http://www.loc.gov/marc/bibliographic/ecbdhome.html
12 -->  
13   <xsl:template name="record-hook"/>
14
15   <xsl:template match="/">
16     <xsl:apply-templates/>
17   </xsl:template>
18
19   <xsl:template match="marc:record">
20     <xsl:variable name="title_medium" select="marc:datafield[@tag='245']/marc:subfield[@code='h']"/>
21     <xsl:variable name="journal_title" select="marc:datafield[@tag='773']/marc:subfield[@code='t']"/>
22     <xsl:variable name="electronic_location_url" select="marc:datafield[@tag='856']/marc:subfield[@code='u']"/>
23     <xsl:variable name="fulltext_a" select="marc:datafield[@tag='900']/marc:subfield[@code='a']"/>
24     <xsl:variable name="fulltext_b" select="marc:datafield[@tag='900']/marc:subfield[@code='b']"/>
25     <xsl:variable name="medium">
26       <xsl:choose>
27         <xsl:when test="$title_medium">
28           <xsl:value-of select="translate($title_medium, ' []/', '')"/>
29         </xsl:when>
30         <xsl:when test="$fulltext_a">
31           <xsl:text>electronic resource</xsl:text>
32         </xsl:when>
33         <xsl:when test="$fulltext_b">
34           <xsl:text>electronic resource</xsl:text>
35         </xsl:when>
36         <xsl:when test="$journal_title">
37           <xsl:text>article</xsl:text>
38         </xsl:when>
39         <xsl:otherwise>
40           <xsl:text>book</xsl:text>
41         </xsl:otherwise>
42       </xsl:choose>
43     </xsl:variable>
44
45     <pz:record>
46       
47       <xsl:for-each select="marc:controlfield[@tag='001']">
48         <pz:metadata type="id">
49           <xsl:value-of select="."/>
50         </pz:metadata>
51       </xsl:for-each>
52
53       <xsl:for-each select="marc:datafield[@tag='010']">
54         <pz:metadata type="lccn">
55           <xsl:value-of select="marc:subfield[@code='a']"/>
56         </pz:metadata>
57       </xsl:for-each>
58
59       <xsl:for-each select="marc:datafield[@tag='020']">
60         <pz:metadata type="isbn">
61           <xsl:value-of select="marc:subfield[@code='a']"/>
62         </pz:metadata>
63       </xsl:for-each>
64
65       <xsl:for-each select="marc:datafield[@tag='022']">
66         <pz:metadata type="issn">
67           <xsl:value-of select="marc:subfield[@code='a']"/>
68         </pz:metadata>
69       </xsl:for-each>
70
71       <xsl:for-each select="marc:datafield[@tag='027']">
72         <pz:metadata type="tech-rep-nr">
73           <xsl:value-of select="marc:subfield[@code='a']"/>
74         </pz:metadata>
75       </xsl:for-each>
76
77       <xsl:for-each select="marc:datafield[@tag='035']">
78         <pz:metadata type="system-control-nr">
79           <xsl:value-of select="marc:subfield[@code='a']"/>
80         </pz:metadata>
81       </xsl:for-each>
82
83       <xsl:for-each select="marc:datafield[@tag='100']">
84         <pz:metadata type="author">
85           <xsl:value-of select="marc:subfield[@code='a']"/>
86         </pz:metadata>
87         <pz:metadata type="author-title">
88           <xsl:value-of select="marc:subfield[@code='c']"/>
89         </pz:metadata>
90         <pz:metadata type="author-date">
91           <xsl:value-of select="marc:subfield[@code='d']"/>
92         </pz:metadata>
93       </xsl:for-each>
94
95       <xsl:for-each select="marc:datafield[@tag='110']">
96         <pz:metadata type="corporate-name">
97             <xsl:value-of select="marc:subfield[@code='a']"/>
98         </pz:metadata>
99         <pz:metadata type="corporate-location">
100             <xsl:value-of select="marc:subfield[@code='c']"/>
101         </pz:metadata>
102         <pz:metadata type="corporate-date">
103             <xsl:value-of select="marc:subfield[@code='d']"/>
104         </pz:metadata>
105       </xsl:for-each>
106
107       <xsl:for-each select="marc:datafield[@tag='111']">
108         <pz:metadata type="meeting-name">
109             <xsl:value-of select="marc:subfield[@code='a']"/>
110         </pz:metadata>
111         <pz:metadata type="meeting-location">
112             <xsl:value-of select="marc:subfield[@code='c']"/>
113         </pz:metadata>
114         <pz:metadata type="meeting-date">
115             <xsl:value-of select="marc:subfield[@code='d']"/>
116         </pz:metadata>
117       </xsl:for-each>
118
119       <xsl:for-each select="marc:datafield[@tag='260']">
120         <pz:metadata type="date">
121             <xsl:value-of select="marc:subfield[@code='c']"/>
122         </pz:metadata>
123       </xsl:for-each>
124
125       <xsl:for-each select="marc:datafield[@tag='245']">
126         <pz:metadata type="title">
127           <xsl:value-of select="marc:subfield[@code='a']"/>
128         </pz:metadata>
129         <pz:metadata type="title-remainder">
130           <xsl:value-of select="marc:subfield[@code='b']"/>
131         </pz:metadata>
132         <pz:metadata type="title-responsibility">
133           <xsl:value-of select="marc:subfield[@code='c']"/>
134         </pz:metadata>
135         <pz:metadata type="title-dates">
136           <xsl:value-of select="marc:subfield[@code='f']"/>
137         </pz:metadata>
138         <pz:metadata type="title-medium">
139           <xsl:value-of select="marc:subfield[@code='h']"/>
140         </pz:metadata>
141         <pz:metadata type="title-number-section">
142           <xsl:value-of select="marc:subfield[@code='n']"/>
143         </pz:metadata>
144       </xsl:for-each>
145
146       <xsl:for-each select="marc:datafield[@tag='250']">
147         <pz:metadata type="edition">
148             <xsl:value-of select="marc:subfield[@code='a']"/>
149         </pz:metadata>
150       </xsl:for-each>
151
152       <xsl:for-each select="marc:datafield[@tag='260']">
153         <pz:metadata type="publication-place">
154           <xsl:value-of select="marc:subfield[@code='a']"/>
155         </pz:metadata>
156         <pz:metadata type="publication-name">
157           <xsl:value-of select="marc:subfield[@code='b']"/>
158         </pz:metadata>
159         <pz:metadata type="publication-date">
160           <xsl:value-of select="marc:subfield[@code='c']"/>
161         </pz:metadata>
162       </xsl:for-each>
163
164       <xsl:for-each select="marc:datafield[@tag='300']">
165         <pz:metadata type="physical-extent">
166           <xsl:value-of select="marc:subfield[@code='a']"/>
167         </pz:metadata>
168         <pz:metadata type="physical-format">
169           <xsl:value-of select="marc:subfield[@code='b']"/>
170         </pz:metadata>
171         <pz:metadata type="physical-dimensions">
172           <xsl:value-of select="marc:subfield[@code='c']"/>
173         </pz:metadata>
174         <pz:metadata type="physical-accomp">
175           <xsl:value-of select="marc:subfield[@code='e']"/>
176         </pz:metadata>
177         <pz:metadata type="physical-unittype">
178           <xsl:value-of select="marc:subfield[@code='f']"/>
179         </pz:metadata>
180         <pz:metadata type="physical-unitsize">
181           <xsl:value-of select="marc:subfield[@code='g']"/>
182         </pz:metadata>
183         <pz:metadata type="physical-specified">
184           <xsl:value-of select="marc:subfield[@code='3']"/>
185         </pz:metadata>
186       </xsl:for-each>
187
188       <xsl:for-each select="marc:datafield[@tag='440']">
189         <pz:metadata type="series-title">
190           <xsl:value-of select="marc:subfield[@code='a']"/>
191         </pz:metadata>
192       </xsl:for-each>
193
194       <xsl:for-each select="marc:datafield[@tag = '500' or @tag = '505' or
195                 @tag = '518' or @tag = '520' or @tag = '522']">
196         <pz:metadata type="description">
197             <xsl:value-of select="*/text()"/>
198         </pz:metadata>
199       </xsl:for-each>
200       
201       <xsl:for-each select="marc:datafield[@tag='600' or @tag='610' or @tag='611' or @tag='630' or @tag='648' or @tag='650' or @tag='651' or @tag='653' or @tag='654' or @tag='655' or @tag='656' or @tag='657' or @tag='658' or @tag='662' or @tag='69X']">
202         <pz:metadata type="subject">
203           <xsl:value-of select="marc:subfield[@code='a']"/>
204         </pz:metadata>
205         <pz:metadata type="subject-long">
206           <xsl:for-each select="marc:subfield">
207             <xsl:if test="position() > 1">
208               <xsl:text>, </xsl:text>
209             </xsl:if>
210             <xsl:value-of select="."/>
211           </xsl:for-each>
212         </pz:metadata>
213       </xsl:for-each>
214
215       <xsl:for-each select="marc:datafield[@tag='856']">
216         <pz:metadata type="electronic-url">
217           <xsl:value-of select="marc:subfield[@code='u']"/>
218         </pz:metadata>
219         <pz:metadata type="electronic-text">
220           <xsl:value-of select="marc:subfield[@code='y' or @code='3']"/>
221         </pz:metadata>
222         <pz:metadata type="electronic-note">
223           <xsl:value-of select="marc:subfield[@code='z']"/>
224         </pz:metadata>
225         <pz:metadata type="electronic-format-instruction">
226           <xsl:value-of select="marc:subfield[@code='i']"/>
227         </pz:metadata>
228         <pz:metadata type="electronic-format-type">
229           <xsl:value-of select="marc:subfield[@code='q']"/>
230         </pz:metadata>
231       </xsl:for-each>
232
233       <xsl:for-each select="marc:datafield[@tag='773']">
234         <pz:metadata type="citation">
235               <xsl:for-each select="*">
236                 <xsl:value-of select="normalize-space(.)"/>
237                 <xsl:text> </xsl:text>
238           </xsl:for-each>
239         </pz:metadata>
240         <xsl:if test="marc:subfield[@code='t']">
241           <pz:metadata type="journal-title">
242                 <xsl:value-of select="marc:subfield[@code='t']"/>
243           </pz:metadata>          
244         </xsl:if>
245         <xsl:if test="marc:subfield[@code='g']">
246           <pz:metadata type="journal-subpart">
247                 <xsl:value-of select="marc:subfield[@code='g']"/>
248           </pz:metadata>          
249         </xsl:if>
250       </xsl:for-each>
251
252       <xsl:for-each select="marc:datafield[@tag='852']">
253         <xsl:if test="marc:subfield[@code='y']">
254           <pz:metadata type="publicnote">
255             <xsl:value-of select="marc:subfield[@code='y']"/>
256           </pz:metadata>
257         </xsl:if>
258         <xsl:if test="marc:subfield[@code='h']">
259           <pz:metadata type="callnumber">
260             <xsl:value-of select="marc:subfield[@code='h']"/>
261           </pz:metadata>
262         </xsl:if>
263       </xsl:for-each>
264
265       <pz:metadata type="medium">
266         <xsl:value-of select="$medium"/>
267       </pz:metadata>
268       
269       <xsl:for-each select="marc:datafield[@tag='900']/marc:subfield[@code='a']">
270         <pz:metadata type="fulltext">
271           <xsl:value-of select="."/>
272         </pz:metadata>
273       </xsl:for-each>
274
275       <!-- <xsl:if test="$fulltext_a">
276         <pz:metadata type="fulltext">
277           <xsl:value-of select="$fulltext_a"/>
278         </pz:metadata>
279       </xsl:if> -->
280
281       <xsl:for-each select="marc:datafield[@tag='900']/marc:subfield[@code='b']">
282         <pz:metadata type="fulltext">
283           <xsl:value-of select="."/>
284         </pz:metadata>
285       </xsl:for-each>
286
287       <!-- <xsl:if test="$fulltext_b">
288         <pz:metadata type="fulltext">
289           <xsl:value-of select="$fulltext_b"/>
290         </pz:metadata>
291       </xsl:if> -->
292
293       <xsl:for-each select="marc:datafield[@tag='907' or @tag='901']">
294         <pz:metadata type="iii-id">
295           <xsl:value-of select="marc:subfield[@code='a']"/>
296         </pz:metadata>
297       </xsl:for-each>
298
299       <xsl:for-each select="marc:datafield[@tag='926']">
300         <pz:metadata type="holding">
301           <xsl:for-each select="marc:subfield">
302             <xsl:if test="position() > 1">
303               <xsl:text> </xsl:text>
304             </xsl:if>
305             <xsl:value-of select="."/>
306           </xsl:for-each>
307         </pz:metadata>
308       </xsl:for-each>
309
310       <xsl:for-each select="marc:datafield[@tag='948']">
311         <pz:metadata type="holding">
312           <xsl:for-each select="marc:subfield">
313             <xsl:if test="position() > 1">
314               <xsl:text> </xsl:text>
315             </xsl:if>
316             <xsl:value-of select="."/>
317           </xsl:for-each>
318         </pz:metadata>
319       </xsl:for-each>
320
321       <xsl:for-each select="marc:datafield[@tag='991']">
322         <pz:metadata type="holding">
323           <xsl:for-each select="marc:subfield">
324             <xsl:if test="position() > 1">
325               <xsl:text> </xsl:text>
326             </xsl:if>
327             <xsl:value-of select="."/>
328           </xsl:for-each>
329         </pz:metadata>
330       </xsl:for-each>
331
332       <!-- passthrough id data -->
333       <xsl:for-each select="pz:metadata">
334           <xsl:copy-of select="."/>
335       </xsl:for-each>
336
337       <!-- other stylesheets importing this might want to define this -->
338       <xsl:call-template name="record-hook"/>
339
340     </pz:record>    
341   </xsl:template>
342   
343   <xsl:template match="text()"/>
344
345 </xsl:stylesheet>