61cb64181cbd0e0c8e2c3170810c2bfa13d1ca63
[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       <xsl:attribute name="mergekey">
47         <xsl:text>title </xsl:text>
48         <xsl:value-of select="marc:datafield[@tag='245']/marc:subfield[@code='a']"/>
49         <xsl:text> author </xsl:text>
50         <xsl:value-of select="marc:datafield[@tag='100']/marc:subfield[@code='a']"/>
51         <xsl:text> medium </xsl:text>
52         <xsl:value-of select="$medium"/>
53       </xsl:attribute>
54
55       
56       <xsl:for-each select="marc:controlfield[@tag='001']">
57         <pz:metadata type="id">
58           <xsl:value-of select="."/>
59         </pz:metadata>
60       </xsl:for-each>
61
62       <xsl:for-each select="marc:datafield[@tag='010']">
63         <pz:metadata type="lccn">
64           <xsl:value-of select="marc:subfield[@code='a']"/>
65         </pz:metadata>
66       </xsl:for-each>
67
68       <xsl:for-each select="marc:datafield[@tag='020']">
69         <pz:metadata type="isbn">
70           <xsl:value-of select="marc:subfield[@code='a']"/>
71         </pz:metadata>
72       </xsl:for-each>
73
74       <xsl:for-each select="marc:datafield[@tag='022']">
75         <pz:metadata type="issn">
76           <xsl:value-of select="marc:subfield[@code='a']"/>
77         </pz:metadata>
78       </xsl:for-each>
79
80       <xsl:for-each select="marc:datafield[@tag='027']">
81         <pz:metadata type="tech-rep-nr">
82           <xsl:value-of select="marc:subfield[@code='a']"/>
83         </pz:metadata>
84       </xsl:for-each>
85
86       <xsl:for-each select="marc:datafield[@tag='035']">
87         <pz:metadata type="system-control-nr">
88           <xsl:value-of select="marc:subfield[@code='a']"/>
89         </pz:metadata>
90       </xsl:for-each>
91
92       <xsl:for-each select="marc:datafield[@tag='100']">
93         <pz:metadata type="author">
94           <xsl:value-of select="marc:subfield[@code='a']"/>
95         </pz:metadata>
96         <pz:metadata type="author-title">
97           <xsl:value-of select="marc:subfield[@code='c']"/>
98         </pz:metadata>
99         <pz:metadata type="author-date">
100           <xsl:value-of select="marc:subfield[@code='d']"/>
101         </pz:metadata>
102       </xsl:for-each>
103
104       <xsl:for-each select="marc:datafield[@tag='110']">
105         <pz:metadata type="corporate-name">
106             <xsl:value-of select="marc:subfield[@code='a']"/>
107         </pz:metadata>
108         <pz:metadata type="corporate-location">
109             <xsl:value-of select="marc:subfield[@code='c']"/>
110         </pz:metadata>
111         <pz:metadata type="corporate-date">
112             <xsl:value-of select="marc:subfield[@code='d']"/>
113         </pz:metadata>
114       </xsl:for-each>
115
116       <xsl:for-each select="marc:datafield[@tag='111']">
117         <pz:metadata type="meeting-name">
118             <xsl:value-of select="marc:subfield[@code='a']"/>
119         </pz:metadata>
120         <pz:metadata type="meeting-location">
121             <xsl:value-of select="marc:subfield[@code='c']"/>
122         </pz:metadata>
123         <pz:metadata type="meeting-date">
124             <xsl:value-of select="marc:subfield[@code='d']"/>
125         </pz:metadata>
126       </xsl:for-each>
127
128       <xsl:for-each select="marc:datafield[@tag='260']">
129         <pz:metadata type="date">
130             <xsl:value-of select="marc:subfield[@code='c']"/>
131         </pz:metadata>
132       </xsl:for-each>
133
134       <xsl:for-each select="marc:datafield[@tag='245']">
135         <pz:metadata type="title">
136           <xsl:value-of select="marc:subfield[@code='a']"/>
137         </pz:metadata>
138         <pz:metadata type="title-remainder">
139           <xsl:value-of select="marc:subfield[@code='b']"/>
140         </pz:metadata>
141         <pz:metadata type="title-responsibility">
142           <xsl:value-of select="marc:subfield[@code='c']"/>
143         </pz:metadata>
144         <pz:metadata type="title-dates">
145           <xsl:value-of select="marc:subfield[@code='f']"/>
146         </pz:metadata>
147         <pz:metadata type="title-medium">
148           <xsl:value-of select="marc:subfield[@code='h']"/>
149         </pz:metadata>
150         <pz:metadata type="title-number-section">
151           <xsl:value-of select="marc:subfield[@code='n']"/>
152         </pz:metadata>
153       </xsl:for-each>
154
155       <xsl:for-each select="marc:datafield[@tag='250']">
156         <pz:metadata type="edition">
157             <xsl:value-of select="marc:subfield[@code='a']"/>
158         </pz:metadata>
159       </xsl:for-each>
160
161       <xsl:for-each select="marc:datafield[@tag='260']">
162         <pz:metadata type="publication-place">
163           <xsl:value-of select="marc:subfield[@code='a']"/>
164         </pz:metadata>
165         <pz:metadata type="publication-name">
166           <xsl:value-of select="marc:subfield[@code='b']"/>
167         </pz:metadata>
168         <pz:metadata type="publication-date">
169           <xsl:value-of select="marc:subfield[@code='c']"/>
170         </pz:metadata>
171       </xsl:for-each>
172
173       <xsl:for-each select="marc:datafield[@tag='300']">
174         <pz:metadata type="physical-extent">
175           <xsl:value-of select="marc:subfield[@code='a']"/>
176         </pz:metadata>
177         <pz:metadata type="physical-format">
178           <xsl:value-of select="marc:subfield[@code='b']"/>
179         </pz:metadata>
180         <pz:metadata type="physical-dimensions">
181           <xsl:value-of select="marc:subfield[@code='c']"/>
182         </pz:metadata>
183         <pz:metadata type="physical-accomp">
184           <xsl:value-of select="marc:subfield[@code='e']"/>
185         </pz:metadata>
186         <pz:metadata type="physical-unittype">
187           <xsl:value-of select="marc:subfield[@code='f']"/>
188         </pz:metadata>
189         <pz:metadata type="physical-unitsize">
190           <xsl:value-of select="marc:subfield[@code='g']"/>
191         </pz:metadata>
192         <pz:metadata type="physical-specified">
193           <xsl:value-of select="marc:subfield[@code='3']"/>
194         </pz:metadata>
195       </xsl:for-each>
196
197       <xsl:for-each select="marc:datafield[@tag='440']">
198         <pz:metadata type="series-title">
199           <xsl:value-of select="marc:subfield[@code='a']"/>
200         </pz:metadata>
201       </xsl:for-each>
202
203       <xsl:for-each select="marc:datafield[@tag = '500' or @tag = '505' or
204                 @tag = '518' or @tag = '520' or @tag = '522']">
205         <pz:metadata type="description">
206             <xsl:value-of select="*/text()"/>
207         </pz:metadata>
208       </xsl:for-each>
209       
210       <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']">
211         <pz:metadata type="subject">
212           <xsl:value-of select="marc:subfield[@code='a']"/>
213         </pz:metadata>
214         <pz:metadata type="subject-long">
215           <xsl:for-each select="marc:subfield">
216             <xsl:if test="position() > 1">
217               <xsl:text>, </xsl:text>
218             </xsl:if>
219             <xsl:value-of select="."/>
220           </xsl:for-each>
221         </pz:metadata>
222       </xsl:for-each>
223
224       <xsl:for-each select="marc:datafield[@tag='856']">
225         <pz:metadata type="electronic-url">
226           <xsl:value-of select="marc:subfield[@code='u']"/>
227         </pz:metadata>
228         <pz:metadata type="electronic-text">
229           <xsl:value-of select="marc:subfield[@code='y' or @code='3']"/>
230         </pz:metadata>
231         <pz:metadata type="electronic-note">
232           <xsl:value-of select="marc:subfield[@code='z']"/>
233         </pz:metadata>
234         <pz:metadata type="electronic-format-instruction">
235           <xsl:value-of select="marc:subfield[@code='i']"/>
236         </pz:metadata>
237         <pz:metadata type="electronic-format-type">
238           <xsl:value-of select="marc:subfield[@code='q']"/>
239         </pz:metadata>
240       </xsl:for-each>
241
242       <xsl:for-each select="marc:datafield[@tag='773']">
243         <pz:metadata type="citation">
244           <xsl:for-each select="*">
245             <xsl:value-of select="normalize-space(.)"/>
246             <xsl:text> </xsl:text>
247           </xsl:for-each>
248         </pz:metadata>
249       </xsl:for-each>
250
251       <xsl:for-each select="marc:datafield[@tag='852']">
252         <xsl:if test="marc:subfield[@code='y']">
253           <pz:metadata type="publicnote">
254             <xsl:value-of select="marc:subfield[@code='y']"/>
255           </pz:metadata>
256         </xsl:if>
257         <xsl:if test="marc:subfield[@code='h']">
258           <pz:metadata type="callnumber">
259             <xsl:value-of select="marc:subfield[@code='h']"/>
260           </pz:metadata>
261         </xsl:if>
262       </xsl:for-each>
263
264       <pz:metadata type="medium">
265         <xsl:value-of select="$medium"/>
266       </pz:metadata>
267       
268       <xsl:for-each select="marc:datafield[@tag='900']/marc:subfield[@code='a']">
269         <pz:metadata type="fulltext">
270           <xsl:value-of select="."/>
271         </pz:metadata>
272       </xsl:for-each>
273
274       <!-- <xsl:if test="$fulltext_a">
275         <pz:metadata type="fulltext">
276           <xsl:value-of select="$fulltext_a"/>
277         </pz:metadata>
278       </xsl:if> -->
279
280       <xsl:for-each select="marc:datafield[@tag='900']/marc:subfield[@code='b']">
281         <pz:metadata type="fulltext">
282           <xsl:value-of select="."/>
283         </pz:metadata>
284       </xsl:for-each>
285
286       <!-- <xsl:if test="$fulltext_b">
287         <pz:metadata type="fulltext">
288           <xsl:value-of select="$fulltext_b"/>
289         </pz:metadata>
290       </xsl:if> -->
291
292       <xsl:for-each select="marc:datafield[@tag='907' or @tag='901']">
293         <pz:metadata type="iii-id">
294           <xsl:value-of select="marc:subfield[@code='a']"/>
295         </pz:metadata>
296       </xsl:for-each>
297
298       <xsl:for-each select="marc:datafield[@tag='926']">
299         <pz:metadata type="holding">
300           <xsl:for-each select="marc:subfield">
301             <xsl:if test="position() > 1">
302               <xsl:text> </xsl:text>
303             </xsl:if>
304             <xsl:value-of select="."/>
305           </xsl:for-each>
306         </pz:metadata>
307       </xsl:for-each>
308
309       <xsl:for-each select="marc:datafield[@tag='948']">
310         <pz:metadata type="holding">
311           <xsl:for-each select="marc:subfield">
312             <xsl:if test="position() > 1">
313               <xsl:text> </xsl:text>
314             </xsl:if>
315             <xsl:value-of select="."/>
316           </xsl:for-each>
317         </pz:metadata>
318       </xsl:for-each>
319
320       <xsl:for-each select="marc:datafield[@tag='991']">
321         <pz:metadata type="holding">
322           <xsl:for-each select="marc:subfield">
323             <xsl:if test="position() > 1">
324               <xsl:text> </xsl:text>
325             </xsl:if>
326             <xsl:value-of select="."/>
327           </xsl:for-each>
328         </pz:metadata>
329       </xsl:for-each>
330
331       <!-- passthrough id data -->
332       <xsl:for-each select="pz:metadata">
333           <xsl:copy-of select="."/>
334       </xsl:for-each>
335
336       <!-- other stylesheets importing this might want to define this -->
337       <xsl:call-template name="record-hook"/>
338
339     </pz:record>    
340   </xsl:template>
341   
342   <xsl:template match="text()"/>
343
344 </xsl:stylesheet>