enhanced MARC21 excration such that all full text fields are found, not only the...
[pazpar2-moved-to-github.git] / etc / marc21.xsl
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- $Id: marc21.xsl,v 1.22 2007-10-04 12:01:15 adam 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   <xsl:include href="pz2-ourl-marc21.xsl" />
16   
17   <xsl:template match="/marc:record">
18     <xsl:variable name="title_medium" select="marc:datafield[@tag='245']/marc:subfield[@code='h']"/>
19     <xsl:variable name="journal_title" select="marc:datafield[@tag='773']/marc:subfield[@code='t']"/>
20     <xsl:variable name="electronic_location_url" select="marc:datafield[@tag='856']/marc:subfield[@code='u']"/>
21     <xsl:variable name="fulltext_a" select="marc:datafield[@tag='900']/marc:subfield[@code='a']"/>
22     <xsl:variable name="fulltext_b" select="marc:datafield[@tag='900']/marc:subfield[@code='b']"/>
23     <xsl:variable name="medium">
24       <xsl:choose>
25         <xsl:when test="$title_medium">
26           <xsl:value-of select="substring-after(substring-before($title_medium,']'),'[')"/>
27         </xsl:when>
28         <xsl:when test="$fulltext_a">
29           <xsl:text>electronic resource</xsl:text>
30         </xsl:when>
31         <xsl:when test="$fulltext_b">
32           <xsl:text>electronic resource</xsl:text>
33         </xsl:when>
34         <xsl:when test="$electronic_location_url">
35           <xsl:text>electronic resource</xsl:text>
36         </xsl:when>
37         <xsl:when test="$journal_title">
38           <xsl:text>article</xsl:text>
39         </xsl:when>
40         <xsl:otherwise>
41           <xsl:text>book</xsl:text>
42         </xsl:otherwise>
43       </xsl:choose>
44     </xsl:variable>
45
46     <pz:record>
47       <xsl:attribute name="mergekey">
48         <xsl:text>title </xsl:text>
49         <xsl:value-of select="marc:datafield[@tag='245']/marc:subfield[@code='a']"/>
50         <xsl:text> author </xsl:text>
51         <xsl:value-of select="marc:datafield[@tag='100']/marc:subfield[@code='a']"/>
52         <xsl:text> medium </xsl:text>
53         <xsl:value-of select="$medium"/>
54       </xsl:attribute>
55
56       
57       <xsl:for-each select="marc:controlfield[@tag='001']">
58         <pz:metadata type="id">
59           <xsl:value-of select="."/>
60         </pz:metadata>
61       </xsl:for-each>
62
63       <xsl:for-each select="marc:datafield[@tag='010']">
64         <pz:metadata type="lccn">
65           <xsl:value-of select="marc:subfield[@code='a']"/>
66         </pz:metadata>
67       </xsl:for-each>
68
69       <xsl:for-each select="marc:datafield[@tag='020']">
70         <pz:metadata type="isbn">
71           <xsl:value-of select="marc:subfield[@code='a']"/>
72         </pz:metadata>
73       </xsl:for-each>
74
75       <xsl:for-each select="marc:datafield[@tag='022']">
76         <pz:metadata type="issn">
77           <xsl:value-of select="marc:subfield[@code='a']"/>
78         </pz:metadata>
79       </xsl:for-each>
80
81       <xsl:for-each select="marc:datafield[@tag='027']">
82         <pz:metadata type="tech-rep-nr">
83           <xsl:value-of select="marc:subfield[@code='a']"/>
84         </pz:metadata>
85       </xsl:for-each>
86
87       <xsl:for-each select="marc:datafield[@tag='100']">
88         <pz:metadata type="author">
89           <xsl:value-of select="marc:subfield[@code='a']"/>
90         </pz:metadata>
91         <pz:metadata type="author-title">
92           <xsl:value-of select="marc:subfield[@code='c']"/>
93         </pz:metadata>
94         <pz:metadata type="author-date">
95           <xsl:value-of select="marc:subfield[@code='d']"/>
96         </pz:metadata>
97       </xsl:for-each>
98
99       <xsl:for-each select="marc:datafield[@tag='110']">
100         <pz:metadata type="corporate-name">
101             <xsl:value-of select="marc:subfield[@code='a']"/>
102         </pz:metadata>
103         <pz:metadata type="corporate-location">
104             <xsl:value-of select="marc:subfield[@code='c']"/>
105         </pz:metadata>
106         <pz:metadata type="corporate-date">
107             <xsl:value-of select="marc:subfield[@code='d']"/>
108         </pz:metadata>
109       </xsl:for-each>
110
111       <xsl:for-each select="marc:datafield[@tag='111']">
112         <pz:metadata type="meeting-name">
113             <xsl:value-of select="marc:subfield[@code='a']"/>
114         </pz:metadata>
115         <pz:metadata type="meeting-location">
116             <xsl:value-of select="marc:subfield[@code='c']"/>
117         </pz:metadata>
118         <pz:metadata type="meeting-date">
119             <xsl:value-of select="marc:subfield[@code='d']"/>
120         </pz:metadata>
121       </xsl:for-each>
122
123       <xsl:for-each select="marc:datafield[@tag='260']">
124         <pz:metadata type="date">
125             <xsl:value-of select="marc:subfield[@code='c']"/>
126         </pz:metadata>
127       </xsl:for-each>
128
129       <xsl:for-each select="marc:datafield[@tag='245']">
130         <pz:metadata type="title">
131           <xsl:value-of select="marc:subfield[@code='a']"/>
132         </pz:metadata>
133         <pz:metadata type="title-remainder">
134           <xsl:value-of select="marc:subfield[@code='b']"/>
135         </pz:metadata>
136         <pz:metadata type="title-responsibility">
137           <xsl:value-of select="marc:subfield[@code='c']"/>
138         </pz:metadata>
139         <pz:metadata type="title-dates">
140           <xsl:value-of select="marc:subfield[@code='f']"/>
141         </pz:metadata>
142         <pz:metadata type="title-medium">
143           <xsl:value-of select="marc:subfield[@code='h']"/>
144         </pz:metadata>
145         <pz:metadata type="title-number-section">
146           <xsl:value-of select="marc:subfield[@code='n']"/>
147         </pz:metadata>
148       </xsl:for-each>
149
150       <xsl:for-each select="marc:datafield[@tag='250']">
151         <pz:metadata type="edition">
152             <xsl:value-of select="marc:subfield[@code='a']"/>
153         </pz:metadata>
154       </xsl:for-each>
155
156       <xsl:for-each select="marc:datafield[@tag='260']">
157         <pz:metadata type="publication-place">
158           <xsl:value-of select="marc:subfield[@code='a']"/>
159         </pz:metadata>
160         <pz:metadata type="publication-name">
161           <xsl:value-of select="marc:subfield[@code='b']"/>
162         </pz:metadata>
163         <pz:metadata type="publication-date">
164           <xsl:value-of select="marc:subfield[@code='c']"/>
165         </pz:metadata>
166       </xsl:for-each>
167
168       <xsl:for-each select="marc:datafield[@tag='300']">
169         <pz:metadata type="physical-extent">
170           <xsl:value-of select="marc:subfield[@code='a']"/>
171         </pz:metadata>
172         <pz:metadata type="physical-format">
173           <xsl:value-of select="marc:subfield[@code='b']"/>
174         </pz:metadata>
175         <pz:metadata type="physical-dimensions">
176           <xsl:value-of select="marc:subfield[@code='c']"/>
177         </pz:metadata>
178         <pz:metadata type="physical-accomp">
179           <xsl:value-of select="marc:subfield[@code='e']"/>
180         </pz:metadata>
181         <pz:metadata type="physical-unittype">
182           <xsl:value-of select="marc:subfield[@code='f']"/>
183         </pz:metadata>
184         <pz:metadata type="physical-unitsize">
185           <xsl:value-of select="marc:subfield[@code='g']"/>
186         </pz:metadata>
187         <pz:metadata type="physical-specified">
188           <xsl:value-of select="marc:subfield[@code='3']"/>
189         </pz:metadata>
190       </xsl:for-each>
191
192       <xsl:for-each select="marc:datafield[@tag='440']">
193         <pz:metadata type="series-title">
194           <xsl:value-of select="marc:subfield[@code='a']"/>
195         </pz:metadata>
196       </xsl:for-each>
197
198       <xsl:for-each select="marc:datafield[@tag &gt;= 500 and @tag &lt;= 599]
199                             [@tag != '506' and @tag != '530' and
200                             @tag != '540' and @tag != '546'
201                             and @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='650' or @tag='651' or @tag='653']">
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']"/>
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:if test="$open_url_resolver">
271         <pz:metadata type="open-url">
272             <xsl:call-template name="insert-md-openurl" />
273         </pz:metadata>
274       </xsl:if>
275
276     </pz:record>
277
278   </xsl:template>
279
280 </xsl:stylesheet>