Heuristics to deal with Primo s/e/page PAZ-1001
[pazpar2-moved-to-github.git] / etc / xsl / primo-pz2.xsl
1 <?xml version="1.0" encoding="UTF-8"?>
2 <xsl:stylesheet version="1.0"
3   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4   xmlns:pz="http://www.indexdata.com/pazpar2/1.0"
5   xmlns:tmarc="http://www.indexdata.com/turbomarc"
6   xmlns:prim="http://www.exlibrisgroup.com/xsd/primo/primo_nm_bib"
7   xmlns:sear="http://www.exlibrisgroup.com/xsd/jaguar/search"
8   >
9   <xsl:output indent="yes" method="xml" version="1.0"
10     encoding="UTF-8" />
11   <xsl:template name="record-hook" />
12   <xsl:variable name="type" select="/opt/prim:PrimoNMBib/prim:display/prim:type"/>
13   <xsl:variable name="is_article" select="$type = 'article'" />
14   <xsl:variable name="fulltext" select="/opt/prim:PrimoNMBib/prim:delivery/prim:fulltext"/>
15   <xsl:variable name="has_fulltext">
16     <xsl:choose>
17       <xsl:when test="$fulltext = 'no_fulltext' ">
18         <xsl:text>no</xsl:text>
19       </xsl:when>
20       <xsl:when test="$fulltext = 'fulltext'">
21         <xsl:text>yes</xsl:text>
22       </xsl:when>
23       <xsl:otherwise>
24         <xsl:text>no</xsl:text>
25       </xsl:otherwise>
26     </xsl:choose>
27   </xsl:variable>
28
29   <xsl:template match="/">
30     <xsl:apply-templates />
31   </xsl:template>
32
33   <xsl:template match="sear:RESULT">
34     <pz:records>
35       <xsl:apply-templates />
36     </pz:records>
37   </xsl:template>
38
39   <xsl:template match="sear:DOC">
40     <pz:record>
41       <xsl:apply-templates />
42     </pz:record>
43   </xsl:template>
44
45   <xsl:template match="prim:PrimoNMBib">
46     <xsl:apply-templates />
47   </xsl:template>
48
49   <xsl:template match="prim:control">
50     <xsl:for-each select="prim:recordid">
51       <pz:metadata type="id">
52         <xsl:value-of select="."/>
53       </pz:metadata>
54     </xsl:for-each>
55   </xsl:template>
56
57   <xsl:template match="prim:addata">
58     <!--    <xsl:variable name="yearmonthday" select="@date" /> -->
59
60     <xsl:for-each select="prim:date">
61       <pz:metadata type="date">
62         <xsl:value-of select="substring(.,1,4)" />
63       </pz:metadata>
64       <pz:metadata type="journal-month">
65         <xsl:value-of select="substring(.,4,1)" />
66       </pz:metadata>
67     </xsl:for-each>
68
69     <xsl:for-each select="prim:volume">
70       <pz:metadata type="volume-number">
71         <xsl:value-of select="." />
72       </pz:metadata>
73     </xsl:for-each>
74
75     <xsl:for-each select="prim:issue">
76       <pz:metadata type="issue-number">
77         <xsl:value-of select="." />
78       </pz:metadata>
79     </xsl:for-each>
80
81     <xsl:variable name="spage" select="prim:spage" />
82     <xsl:variable name="epage" select="prim:epage" />
83     <xsl:variable name="pages" select="prim:pages" />
84
85     <xsl:choose>
86       <!-- in some case primo wrongly returns a range in spage, we're done -->
87       <xsl:when test="contains($spage,'-')">
88         <pz:metadata type="pages-number">
89           <xsl:value-of select="$spage" />
90         </pz:metadata>
91       </xsl:when>
92       <!-- if there is a range in pages, we're also done -->
93       <xsl:when test="contains($pages,'-')">
94         <pz:metadata type="pages-number">
95           <xsl:value-of select="$pages" />
96         </pz:metadata>
97       </xsl:when>
98       <!-- otherwise, construct -->
99       <xsl:when test="$spage">
100         <pz:metadata type="pages-number">
101           <xsl:value-of select="$spage" />
102           <xsl:if test="string-length($epage)">
103             <xsl:text>-</xsl:text>
104             <xsl:value-of select="$epage" />
105           </xsl:if>
106         </pz:metadata>
107       </xsl:when>
108     </xsl:choose>
109
110     <xsl:for-each select="prim:issn">
111       <pz:metadata type="issn">
112         <xsl:value-of select="." />
113       </pz:metadata>
114     </xsl:for-each>
115
116     <xsl:for-each select="prim:jtitle">
117       <pz:metadata type="journal-title">
118         <xsl:value-of select="." />
119       </pz:metadata>
120     </xsl:for-each>
121   </xsl:template>
122
123   <xsl:template match="prim:delivery">
124     <xsl:if test="$has_fulltext">
125       <pz:metadata type="has-fulltext">
126         <xsl:value-of select="$has_fulltext" />
127       </pz:metadata>
128     </xsl:if>
129   </xsl:template>
130
131   <xsl:template match="prim:display">
132     <xsl:for-each select="prim:type">
133       <xsl:variable name="type" select="."/>
134       <pz:metadata type="medium">
135         <xsl:choose>
136           <xsl:when test="$type ='article' and $has_fulltext = 'yes'">
137             <xsl:text>e-article</xsl:text>
138           </xsl:when>
139           <xsl:when  test="$type = 'article' and $has_fulltext = 'no'">
140             <xsl:text>article</xsl:text>
141           </xsl:when>
142           <xsl:otherwise>
143             <xsl:value-of select="$type"/>
144           </xsl:otherwise>
145         </xsl:choose>
146       </pz:metadata>
147       <pz:metadata type="debug_isarticle"><xsl:value-of select="$is_article"/></pz:metadata>
148     </xsl:for-each>
149
150     <xsl:for-each select="prim:title">
151       <pz:metadata type="title">
152         <xsl:value-of select="." />
153       </pz:metadata>
154     </xsl:for-each>
155
156     <xsl:for-each select="prim:ispartof">
157       <pz:metadata type="journal-subpart">
158         <xsl:value-of select="." />
159       </pz:metadata>
160       <pz:metadata type="citation">
161         <xsl:value-of select="." />
162       </pz:metadata>
163     </xsl:for-each>
164   </xsl:template>
165
166   <xsl:template match="prim:facets">
167     <xsl:for-each select="prim:topic">
168        <pz:metadata type="subject">
169         <xsl:value-of select="." />
170       </pz:metadata>
171     </xsl:for-each>
172   </xsl:template>
173
174   <xsl:template match="sear:LINKS" >
175     <xsl:for-each select="sear:openurl">
176       <pz:metadata type="electronic-url">
177         <xsl:value-of select="."/>
178       </pz:metadata>
179     </xsl:for-each>
180   </xsl:template>
181
182   <xsl:template match="prim:search">
183
184     <xsl:for-each select="prim:creatorcontrib">
185        <pz:metadata type="author">
186         <xsl:value-of select="." />
187       </pz:metadata>
188     </xsl:for-each>
189
190     <xsl:for-each select="prim:description">
191       <pz:metadata type="description">
192         <xsl:value-of select="." />
193       </pz:metadata>
194     </xsl:for-each>
195
196
197     <xsl:for-each select="prim:sub">
198       <pz:metadata type="subject">
199         <xsl:value-of select="." />
200       </pz:metadata>
201     </xsl:for-each>
202
203     <!-- passthrough id data -->
204     <xsl:for-each select="pz:metadata">
205       <xsl:copy-of select="." />
206     </xsl:for-each>
207     <!-- other stylesheets importing this might want to define this -->
208
209     <xsl:call-template name="record-hook" />
210   </xsl:template>
211
212   <xsl:template match="text()" />
213
214 </xsl:stylesheet>