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