Included description of settings exposed to records.
[pazpar2-moved-to-github.git] / etc / marc21.xsl
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- $Id: marc21.xsl,v 1.16 2007-07-31 22:35:40 quinn Exp $ -->
3 <xsl:stylesheet
4     version="1.0"
5     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
6     xmlns:pz="http://www.indexdata.com/pazpar2/1.0"
7     xmlns:marc="http://www.loc.gov/MARC21/slim">
8
9   
10   <xsl:output indent="yes" method="xml" version="1.0" encoding="UTF-8"/>
11
12 <!-- Extract metadata from MARC21/USMARC 
13       http://www.loc.gov/marc/bibliographic/ecbdhome.html
14 -->  
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       <xsl:for-each select="marc:controlfield[@tag='001']">
56         <pz:metadata type="id">
57           <xsl:value-of select="."/>
58         </pz:metadata>
59       </xsl:for-each>
60
61       <xsl:for-each select="marc:datafield[@tag='010']">
62         <pz:metadata type="lccn">
63           <xsl:value-of select="marc:subfield[@code='a']"/>
64         </pz:metadata>
65       </xsl:for-each>
66
67       <xsl:for-each select="marc:datafield[@tag='020']">
68         <pz:metadata type="isbn">
69           <xsl:value-of select="marc:subfield[@code='a']"/>
70         </pz:metadata>
71       </xsl:for-each>
72
73       <xsl:for-each select="marc:datafield[@tag='022']">
74         <pz:metadata type="issn">
75           <xsl:value-of select="marc:subfield[@code='a']"/>
76         </pz:metadata>
77       </xsl:for-each>
78
79       <xsl:for-each select="marc:datafield[@tag='027']">
80         <pz:metadata type="tech-rep-nr">
81           <xsl:value-of select="marc:subfield[@code='a']"/>
82         </pz:metadata>
83       </xsl:for-each>
84
85       <xsl:for-each select="marc:datafield[@tag='100']">
86         <pz:metadata type="author">
87           <xsl:value-of select="marc:subfield[@code='a']"/>
88         </pz:metadata>
89         <pz:metadata type="author-title">
90           <xsl:value-of select="marc:subfield[@code='c']"/>
91         </pz:metadata>
92         <pz:metadata type="author-date">
93           <xsl:value-of select="marc:subfield[@code='d']"/>
94         </pz:metadata>
95       </xsl:for-each>
96
97       <xsl:for-each select="marc:datafield[@tag='110']">
98         <pz:metadata type="corporate-name">
99             <xsl:value-of select="marc:subfield[@code='a']"/>
100         </pz:metadata>
101         <pz:metadata type="corporate-location">
102             <xsl:value-of select="marc:subfield[@code='c']"/>
103         </pz:metadata>
104         <pz:metadata type="corporate-date">
105             <xsl:value-of select="marc:subfield[@code='d']"/>
106         </pz:metadata>
107       </xsl:for-each>
108
109       <xsl:for-each select="marc:datafield[@tag='111']">
110         <pz:metadata type="meeting-name">
111             <xsl:value-of select="marc:subfield[@code='a']"/>
112         </pz:metadata>
113         <pz:metadata type="meeting-location">
114             <xsl:value-of select="marc:subfield[@code='c']"/>
115         </pz:metadata>
116         <pz:metadata type="meeting-date">
117             <xsl:value-of select="marc:subfield[@code='d']"/>
118         </pz:metadata>
119       </xsl:for-each>
120
121       <xsl:for-each select="marc:datafield[@tag='260']">
122         <pz:metadata type="date">
123             <xsl:value-of select="marc:subfield[@code='c']"/>
124         </pz:metadata>
125       </xsl:for-each>
126
127       <xsl:for-each select="marc:datafield[@tag='245']">
128         <pz:metadata type="title">
129           <xsl:value-of select="marc:subfield[@code='a']"/>
130         </pz:metadata>
131         <pz:metadata type="title-remainder">
132           <xsl:value-of select="marc:subfield[@code='b']"/>
133         </pz:metadata>
134         <pz:metadata type="title-responsibility">
135           <xsl:value-of select="marc:subfield[@code='c']"/>
136         </pz:metadata>
137         <pz:metadata type="title-dates">
138           <xsl:value-of select="marc:subfield[@code='f']"/>
139         </pz:metadata>
140         <pz:metadata type="title-medium">
141           <xsl:value-of select="marc:subfield[@code='h']"/>
142         </pz:metadata>
143       </xsl:for-each>
144
145       <xsl:for-each select="marc:datafield[@tag='250']">
146         <pz:metadata type="edition">
147             <xsl:value-of select="marc:subfield[@code='a']"/>
148         </pz:metadata>
149       </xsl:for-each>
150
151       <xsl:for-each select="marc:datafield[@tag='260']">
152         <pz:metadata type="publication-place">
153           <xsl:value-of select="marc:subfield[@code='a']"/>
154         </pz:metadata>
155         <pz:metadata type="publication-name">
156           <xsl:value-of select="marc:subfield[@code='b']"/>
157         </pz:metadata>
158         <pz:metadata type="publication-date">
159           <xsl:value-of select="marc:subfield[@code='c']"/>
160         </pz:metadata>
161       </xsl:for-each>
162
163       <xsl:for-each select="marc:datafield[@tag='300']">
164         <pz:metadata type="physical-extent">
165           <xsl:value-of select="marc:subfield[@code='a']"/>
166         </pz:metadata>
167         <pz:metadata type="physical-format">
168           <xsl:value-of select="marc:subfield[@code='b']"/>
169         </pz:metadata>
170         <pz:metadata type="physical-dimensions">
171           <xsl:value-of select="marc:subfield[@code='c']"/>
172         </pz:metadata>
173         <pz:metadata type="physical-accomp">
174           <xsl:value-of select="marc:subfield[@code='e']"/>
175         </pz:metadata>
176         <pz:metadata type="physical-unittype">
177           <xsl:value-of select="marc:subfield[@code='f']"/>
178         </pz:metadata>
179         <pz:metadata type="physical-unitsize">
180           <xsl:value-of select="marc:subfield[@code='g']"/>
181         </pz:metadata>
182         <pz:metadata type="physical-specified">
183           <xsl:value-of select="marc:subfield[@code='3']"/>
184         </pz:metadata>
185       </xsl:for-each>
186
187       <xsl:for-each select="marc:datafield[@tag='440']">
188         <pz:metadata type="series-title">
189           <xsl:value-of select="marc:subfield[@code='a']"/>
190         </pz:metadata>
191       </xsl:for-each>
192
193       <xsl:for-each select="marc:datafield[@tag &gt;= 500 and @tag &lt;= 599]
194                             [@tag != '506' and @tag != '530' and
195                             @tag != '540' and @tag != '546'
196                             and @tag != '522']">
197         <pz:metadata type="description">
198             <xsl:value-of select="*/text()"/>
199         </pz:metadata>
200       </xsl:for-each>
201       
202       <xsl:for-each select="marc:datafield[@tag='650' or @tag='653']">
203         <pz:metadata type="subject">
204           <xsl:value-of select="marc:subfield[@code='a']"/>
205         </pz:metadata>
206       </xsl:for-each>
207
208       <xsl:for-each select="marc:datafield[@tag='856']">
209         <pz:metadata type="electronic-url">
210           <xsl:value-of select="marc:subfield[@code='u']"/>
211         </pz:metadata>
212         <pz:metadata type="electronic-text">
213           <xsl:value-of select="marc:subfield[@code='y']"/>
214         </pz:metadata>
215         <pz:metadata type="electronic-note">
216           <xsl:value-of select="marc:subfield[@code='z']"/>
217         </pz:metadata>
218       </xsl:for-each>
219
220       <xsl:for-each select="marc:datafield[@tag='773']">
221         <pz:metadata type="citation">
222           <xsl:for-each select="*">
223             <xsl:value-of select="normalize-space(.)"/>
224             <xsl:text> </xsl:text>
225           </xsl:for-each>
226         </pz:metadata>
227       </xsl:for-each>
228
229       <pz:metadata type="medium">
230         <xsl:value-of select="$medium"/>
231       </pz:metadata>
232       
233       <xsl:if test="$fulltext_a">
234         <pz:metadata type="fulltext">
235           <xsl:value-of select="$fulltext_a"/>
236         </pz:metadata>
237       </xsl:if>
238
239       <xsl:if test="$fulltext_b">
240         <pz:metadata type="fulltext">
241           <xsl:value-of select="$fulltext_b"/>
242         </pz:metadata>
243       </xsl:if>
244     </pz:record>
245   </xsl:template>
246
247 </xsl:stylesheet>