Reconciling changes
[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   
9   <xsl:output indent="yes" method="xml" version="1.0" encoding="UTF-8"/>
10
11 <!-- Extract metadata from MARC21/USMARC 
12       http://www.loc.gov/marc/bibliographic/ecbdhome.html
13 -->  
14   <xsl:include href="pz2-ourl-marc21.xsl" />
15   
16   <xsl:template match="/marc:record">
17     <xsl:variable name="title_medium" select="marc:datafield[@tag='245']/marc:subfield[@code='h']"/>
18     <xsl:variable name="journal_title" select="marc:datafield[@tag='773']/marc:subfield[@code='t']"/>
19     <xsl:variable name="electronic_location_url" select="marc:datafield[@tag='856']/marc:subfield[@code='u']"/>
20     <xsl:variable name="fulltext_a" select="marc:datafield[@tag='900']/marc:subfield[@code='a']"/>
21     <xsl:variable name="fulltext_b" select="marc:datafield[@tag='900']/marc:subfield[@code='b']"/>
22     <xsl:variable name="medium">
23       <xsl:choose>
24         <xsl:when test="$title_medium">
25           <xsl:value-of select="substring-after(substring-before($title_medium,']'),'[')"/>
26         </xsl:when>
27         <xsl:when test="$fulltext_a">
28           <xsl:text>electronic resource</xsl:text>
29         </xsl:when>
30         <xsl:when test="$fulltext_b">
31           <xsl:text>electronic resource</xsl:text>
32         </xsl:when>
33         <xsl:when test="$journal_title">
34           <xsl:text>article</xsl:text>
35         </xsl:when>
36         <xsl:otherwise>
37           <xsl:text>book</xsl:text>
38         </xsl:otherwise>
39       </xsl:choose>
40     </xsl:variable>
41
42     <pz:record>
43       <xsl:attribute name="mergekey">
44         <xsl:text>title </xsl:text>
45         <xsl:value-of select="marc:datafield[@tag='245']/marc:subfield[@code='a']"/>
46         <xsl:text> author </xsl:text>
47         <xsl:value-of select="marc:datafield[@tag='100']/marc:subfield[@code='a']"/>
48         <xsl:text> medium </xsl:text>
49         <xsl:value-of select="$medium"/>
50       </xsl:attribute>
51
52       
53       <xsl:for-each select="marc:controlfield[@tag='001']">
54         <pz:metadata type="id">
55           <xsl:value-of select="."/>
56         </pz:metadata>
57       </xsl:for-each>
58
59       <xsl:for-each select="marc:datafield[@tag='010']">
60         <pz:metadata type="lccn">
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='020']">
66         <pz:metadata type="isbn">
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='022']">
72         <pz:metadata type="issn">
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='027']">
78         <pz:metadata type="tech-rep-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='035']">
84         <pz:metadata type="system-control-nr">
85           <xsl:value-of select="marc:subfield[@code='a']"/>
86         </pz:metadata>
87       </xsl:for-each>
88
89       <xsl:for-each select="marc:datafield[@tag='100']">
90         <pz:metadata type="author">
91           <xsl:value-of select="marc:subfield[@code='a']"/>
92         </pz:metadata>
93         <pz:metadata type="author-title">
94           <xsl:value-of select="marc:subfield[@code='c']"/>
95         </pz:metadata>
96         <pz:metadata type="author-date">
97           <xsl:value-of select="marc:subfield[@code='d']"/>
98         </pz:metadata>
99       </xsl:for-each>
100
101       <xsl:for-each select="marc:datafield[@tag='110']">
102         <pz:metadata type="corporate-name">
103             <xsl:value-of select="marc:subfield[@code='a']"/>
104         </pz:metadata>
105         <pz:metadata type="corporate-location">
106             <xsl:value-of select="marc:subfield[@code='c']"/>
107         </pz:metadata>
108         <pz:metadata type="corporate-date">
109             <xsl:value-of select="marc:subfield[@code='d']"/>
110         </pz:metadata>
111       </xsl:for-each>
112
113       <xsl:for-each select="marc:datafield[@tag='111']">
114         <pz:metadata type="meeting-name">
115             <xsl:value-of select="marc:subfield[@code='a']"/>
116         </pz:metadata>
117         <pz:metadata type="meeting-location">
118             <xsl:value-of select="marc:subfield[@code='c']"/>
119         </pz:metadata>
120         <pz:metadata type="meeting-date">
121             <xsl:value-of select="marc:subfield[@code='d']"/>
122         </pz:metadata>
123       </xsl:for-each>
124
125       <xsl:for-each select="marc:datafield[@tag='260']">
126         <pz:metadata type="date">
127             <xsl:value-of select="marc:subfield[@code='c']"/>
128         </pz:metadata>
129       </xsl:for-each>
130
131       <xsl:for-each select="marc:datafield[@tag='245']">
132         <pz:metadata type="title">
133           <xsl:value-of select="marc:subfield[@code='a']"/>
134         </pz:metadata>
135         <pz:metadata type="title-remainder">
136           <xsl:value-of select="marc:subfield[@code='b']"/>
137         </pz:metadata>
138         <pz:metadata type="title-responsibility">
139           <xsl:value-of select="marc:subfield[@code='c']"/>
140         </pz:metadata>
141         <pz:metadata type="title-dates">
142           <xsl:value-of select="marc:subfield[@code='f']"/>
143         </pz:metadata>
144         <pz:metadata type="title-medium">
145           <xsl:value-of select="marc:subfield[@code='h']"/>
146         </pz:metadata>
147         <pz:metadata type="title-number-section">
148           <xsl:value-of select="marc:subfield[@code='n']"/>
149         </pz:metadata>
150       </xsl:for-each>
151
152       <xsl:for-each select="marc:datafield[@tag='250']">
153         <pz:metadata type="edition">
154             <xsl:value-of select="marc:subfield[@code='a']"/>
155         </pz:metadata>
156       </xsl:for-each>
157
158       <xsl:for-each select="marc:datafield[@tag='260']">
159         <pz:metadata type="publication-place">
160           <xsl:value-of select="marc:subfield[@code='a']"/>
161         </pz:metadata>
162         <pz:metadata type="publication-name">
163           <xsl:value-of select="marc:subfield[@code='b']"/>
164         </pz:metadata>
165         <pz:metadata type="publication-date">
166           <xsl:value-of select="marc:subfield[@code='c']"/>
167         </pz:metadata>
168       </xsl:for-each>
169
170       <xsl:for-each select="marc:datafield[@tag='300']">
171         <pz:metadata type="physical-extent">
172           <xsl:value-of select="marc:subfield[@code='a']"/>
173         </pz:metadata>
174         <pz:metadata type="physical-format">
175           <xsl:value-of select="marc:subfield[@code='b']"/>
176         </pz:metadata>
177         <pz:metadata type="physical-dimensions">
178           <xsl:value-of select="marc:subfield[@code='c']"/>
179         </pz:metadata>
180         <pz:metadata type="physical-accomp">
181           <xsl:value-of select="marc:subfield[@code='e']"/>
182         </pz:metadata>
183         <pz:metadata type="physical-unittype">
184           <xsl:value-of select="marc:subfield[@code='f']"/>
185         </pz:metadata>
186         <pz:metadata type="physical-unitsize">
187           <xsl:value-of select="marc:subfield[@code='g']"/>
188         </pz:metadata>
189         <pz:metadata type="physical-specified">
190           <xsl:value-of select="marc:subfield[@code='3']"/>
191         </pz:metadata>
192       </xsl:for-each>
193
194       <xsl:for-each select="marc:datafield[@tag='440']">
195         <pz:metadata type="series-title">
196           <xsl:value-of select="marc:subfield[@code='a']"/>
197         </pz:metadata>
198       </xsl:for-each>
199
200       <xsl:for-each select="marc:datafield[@tag = '500' or @tag = '505' or
201                 @tag = '518' or @tag = '520' or @tag = '522']">
202         <pz:metadata type="description">
203             <xsl:value-of select="*/text()"/>
204         </pz:metadata>
205       </xsl:for-each>
206       
207       <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']">
208         <pz:metadata type="subject">
209           <xsl:value-of select="marc:subfield[@code='a']"/>
210         </pz:metadata>
211         <pz:metadata type="subject-long">
212           <xsl:for-each select="marc:subfield">
213             <xsl:if test="position() > 1">
214               <xsl:text>, </xsl:text>
215             </xsl:if>
216             <xsl:value-of select="."/>
217           </xsl:for-each>
218         </pz:metadata>
219       </xsl:for-each>
220
221       <xsl:for-each select="marc:datafield[@tag='856']">
222         <pz:metadata type="electronic-url">
223           <xsl:value-of select="marc:subfield[@code='u']"/>
224         </pz:metadata>
225         <pz:metadata type="electronic-text">
226           <xsl:value-of select="marc:subfield[@code='y' or @code='3']"/>
227         </pz:metadata>
228         <pz:metadata type="electronic-note">
229           <xsl:value-of select="marc:subfield[@code='z']"/>
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:for-each>
241
242       <pz:metadata type="medium">
243         <xsl:value-of select="$medium"/>
244       </pz:metadata>
245       
246       <xsl:for-each select="marc:datafield[@tag='900']/marc:subfield[@code='a']">
247         <pz:metadata type="fulltext">
248           <xsl:value-of select="."/>
249         </pz:metadata>
250       </xsl:for-each>
251
252       <!-- <xsl:if test="$fulltext_a">
253         <pz:metadata type="fulltext">
254           <xsl:value-of select="$fulltext_a"/>
255         </pz:metadata>
256       </xsl:if> -->
257
258       <xsl:for-each select="marc:datafield[@tag='900']/marc:subfield[@code='b']">
259         <pz:metadata type="fulltext">
260           <xsl:value-of select="."/>
261         </pz:metadata>
262       </xsl:for-each>
263
264       <!-- <xsl:if test="$fulltext_b">
265         <pz:metadata type="fulltext">
266           <xsl:value-of select="$fulltext_b"/>
267         </pz:metadata>
268       </xsl:if> -->
269
270       <xsl:for-each select="marc:datafield[@tag='907' or @tag='901']">
271         <pz:metadata type="iii-id">
272           <xsl:value-of select="marc:subfield[@code='a']"/>
273         </pz:metadata>
274       </xsl:for-each>
275
276       <xsl:for-each select="marc:datafield[@tag='926']">
277         <pz:metadata type="holding">
278           <xsl:for-each select="marc:subfield">
279             <xsl:if test="position() > 1">
280               <xsl:text> </xsl:text>
281             </xsl:if>
282             <xsl:value-of select="."/>
283           </xsl:for-each>
284         </pz:metadata>
285       </xsl:for-each>
286
287       <xsl:for-each select="marc:datafield[@tag='948']">
288         <pz:metadata type="holding">
289           <xsl:for-each select="marc:subfield">
290             <xsl:if test="position() > 1">
291               <xsl:text> </xsl:text>
292             </xsl:if>
293             <xsl:value-of select="."/>
294           </xsl:for-each>
295         </pz:metadata>
296       </xsl:for-each>
297
298       <xsl:for-each select="marc:datafield[@tag='991']">
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:if test="$open_url_resolver">
310         <pz:metadata type="open-url">
311             <xsl:call-template name="insert-md-openurl" />
312         </pz:metadata>
313       </xsl:if>
314
315     </pz:record>    
316   </xsl:template>
317   
318   <xsl:template match="text()"/>
319
320 </xsl:stylesheet>