b2c8c13a7b1a10e99d1ce9f2528068f0f54d600f
[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="$electronic_location_url">
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='100']">
87         <pz:metadata type="author">
88           <xsl:value-of select="marc:subfield[@code='a']"/>
89         </pz:metadata>
90         <pz:metadata type="author-title">
91           <xsl:value-of select="marc:subfield[@code='c']"/>
92         </pz:metadata>
93         <pz:metadata type="author-date">
94           <xsl:value-of select="marc:subfield[@code='d']"/>
95         </pz:metadata>
96       </xsl:for-each>
97
98       <xsl:for-each select="marc:datafield[@tag='110']">
99         <pz:metadata type="corporate-name">
100             <xsl:value-of select="marc:subfield[@code='a']"/>
101         </pz:metadata>
102         <pz:metadata type="corporate-location">
103             <xsl:value-of select="marc:subfield[@code='c']"/>
104         </pz:metadata>
105         <pz:metadata type="corporate-date">
106             <xsl:value-of select="marc:subfield[@code='d']"/>
107         </pz:metadata>
108       </xsl:for-each>
109
110       <xsl:for-each select="marc:datafield[@tag='111']">
111         <pz:metadata type="meeting-name">
112             <xsl:value-of select="marc:subfield[@code='a']"/>
113         </pz:metadata>
114         <pz:metadata type="meeting-location">
115             <xsl:value-of select="marc:subfield[@code='c']"/>
116         </pz:metadata>
117         <pz:metadata type="meeting-date">
118             <xsl:value-of select="marc:subfield[@code='d']"/>
119         </pz:metadata>
120       </xsl:for-each>
121
122       <xsl:for-each select="marc:datafield[@tag='260']">
123         <pz:metadata type="date">
124             <xsl:value-of select="marc:subfield[@code='c']"/>
125         </pz:metadata>
126       </xsl:for-each>
127
128       <xsl:for-each select="marc:datafield[@tag='245']">
129         <pz:metadata type="title">
130           <xsl:value-of select="marc:subfield[@code='a']"/>
131         </pz:metadata>
132         <pz:metadata type="title-remainder">
133           <xsl:value-of select="marc:subfield[@code='b']"/>
134         </pz:metadata>
135         <pz:metadata type="title-responsibility">
136           <xsl:value-of select="marc:subfield[@code='c']"/>
137         </pz:metadata>
138         <pz:metadata type="title-dates">
139           <xsl:value-of select="marc:subfield[@code='f']"/>
140         </pz:metadata>
141         <pz:metadata type="title-medium">
142           <xsl:value-of select="marc:subfield[@code='h']"/>
143         </pz:metadata>
144         <pz:metadata type="title-number-section">
145           <xsl:value-of select="marc:subfield[@code='n']"/>
146         </pz:metadata>
147       </xsl:for-each>
148
149       <xsl:for-each select="marc:datafield[@tag='250']">
150         <pz:metadata type="edition">
151             <xsl:value-of select="marc:subfield[@code='a']"/>
152         </pz:metadata>
153       </xsl:for-each>
154
155       <xsl:for-each select="marc:datafield[@tag='260']">
156         <pz:metadata type="publication-place">
157           <xsl:value-of select="marc:subfield[@code='a']"/>
158         </pz:metadata>
159         <pz:metadata type="publication-name">
160           <xsl:value-of select="marc:subfield[@code='b']"/>
161         </pz:metadata>
162         <pz:metadata type="publication-date">
163           <xsl:value-of select="marc:subfield[@code='c']"/>
164         </pz:metadata>
165       </xsl:for-each>
166
167       <xsl:for-each select="marc:datafield[@tag='300']">
168         <pz:metadata type="physical-extent">
169           <xsl:value-of select="marc:subfield[@code='a']"/>
170         </pz:metadata>
171         <pz:metadata type="physical-format">
172           <xsl:value-of select="marc:subfield[@code='b']"/>
173         </pz:metadata>
174         <pz:metadata type="physical-dimensions">
175           <xsl:value-of select="marc:subfield[@code='c']"/>
176         </pz:metadata>
177         <pz:metadata type="physical-accomp">
178           <xsl:value-of select="marc:subfield[@code='e']"/>
179         </pz:metadata>
180         <pz:metadata type="physical-unittype">
181           <xsl:value-of select="marc:subfield[@code='f']"/>
182         </pz:metadata>
183         <pz:metadata type="physical-unitsize">
184           <xsl:value-of select="marc:subfield[@code='g']"/>
185         </pz:metadata>
186         <pz:metadata type="physical-specified">
187           <xsl:value-of select="marc:subfield[@code='3']"/>
188         </pz:metadata>
189       </xsl:for-each>
190
191       <xsl:for-each select="marc:datafield[@tag='440']">
192         <pz:metadata type="series-title">
193           <xsl:value-of select="marc:subfield[@code='a']"/>
194         </pz:metadata>
195       </xsl:for-each>
196
197       <xsl:for-each select="marc:datafield[@tag = '500' or @tag = '505' or
198                 @tag = '518' or @tag = '520' or @tag = '522']">
199         <pz:metadata type="description">
200             <xsl:value-of select="*/text()"/>
201         </pz:metadata>
202       </xsl:for-each>
203       
204       <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']">
205         <pz:metadata type="subject">
206           <xsl:value-of select="marc:subfield[@code='a']"/>
207         </pz:metadata>
208         <pz:metadata type="subject-long">
209           <xsl:for-each select="marc:subfield">
210             <xsl:if test="position() > 1">
211               <xsl:text>, </xsl:text>
212             </xsl:if>
213             <xsl:value-of select="."/>
214           </xsl:for-each>
215         </pz:metadata>
216       </xsl:for-each>
217
218       <xsl:for-each select="marc:datafield[@tag='856']">
219         <pz:metadata type="electronic-url">
220           <xsl:value-of select="marc:subfield[@code='u']"/>
221         </pz:metadata>
222         <pz:metadata type="electronic-text">
223           <xsl:value-of select="marc:subfield[@code='y']"/>
224         </pz:metadata>
225         <pz:metadata type="electronic-note">
226           <xsl:value-of select="marc:subfield[@code='z']"/>
227         </pz:metadata>
228       </xsl:for-each>
229
230       <xsl:for-each select="marc:datafield[@tag='773']">
231         <pz:metadata type="citation">
232           <xsl:for-each select="*">
233             <xsl:value-of select="normalize-space(.)"/>
234             <xsl:text> </xsl:text>
235           </xsl:for-each>
236         </pz:metadata>
237       </xsl:for-each>
238
239       <pz:metadata type="medium">
240         <xsl:value-of select="$medium"/>
241       </pz:metadata>
242       
243       <xsl:for-each select="marc:datafield[@tag='900']/marc:subfield[@code='a']">
244         <pz:metadata type="fulltext">
245           <xsl:value-of select="."/>
246         </pz:metadata>
247       </xsl:for-each>
248
249       <!-- <xsl:if test="$fulltext_a">
250         <pz:metadata type="fulltext">
251           <xsl:value-of select="$fulltext_a"/>
252         </pz:metadata>
253       </xsl:if> -->
254
255       <xsl:for-each select="marc:datafield[@tag='900']/marc:subfield[@code='b']">
256         <pz:metadata type="fulltext">
257           <xsl:value-of select="."/>
258         </pz:metadata>
259       </xsl:for-each>
260
261       <!-- <xsl:if test="$fulltext_b">
262         <pz:metadata type="fulltext">
263           <xsl:value-of select="$fulltext_b"/>
264         </pz:metadata>
265       </xsl:if> -->
266
267       <xsl:for-each select="marc:datafield[@tag='907']">
268         <pz:metadata type="iii-id">
269           <xsl:value-of select="marc:subfield[@code='a']"/>
270         </pz:metadata>
271       </xsl:for-each>
272
273       <xsl:for-each select="marc:datafield[@tag='926']">
274         <pz:metadata type="holding">
275           <xsl:for-each select="marc:subfield">
276             <xsl:if test="position() > 1">
277               <xsl:text> </xsl:text>
278             </xsl:if>
279             <xsl:value-of select="."/>
280           </xsl:for-each>
281         </pz:metadata>
282       </xsl:for-each>
283
284       <xsl:for-each select="marc:datafield[@tag='948']">
285         <pz:metadata type="holding">
286           <xsl:for-each select="marc:subfield">
287             <xsl:if test="position() > 1">
288               <xsl:text> </xsl:text>
289             </xsl:if>
290             <xsl:value-of select="."/>
291           </xsl:for-each>
292         </pz:metadata>
293       </xsl:for-each>
294
295       <xsl:for-each select="marc:datafield[@tag='991']">
296         <pz:metadata type="holding">
297           <xsl:for-each select="marc:subfield">
298             <xsl:if test="position() > 1">
299               <xsl:text> </xsl:text>
300             </xsl:if>
301             <xsl:value-of select="."/>
302           </xsl:for-each>
303         </pz:metadata>
304       </xsl:for-each>
305
306       <xsl:if test="$open_url_resolver">
307         <pz:metadata type="open-url">
308             <xsl:call-template name="insert-md-openurl" />
309         </pz:metadata>
310       </xsl:if>
311
312     </pz:record>    
313   </xsl:template>
314   
315   <xsl:template match="text()"/>
316
317 </xsl:stylesheet>