Keeping track of expected irspy:xxxx elements which could not be found by
[irspy-moved-to-github.git] / xsl / irspy2zeerex.xsl
1 <?xml version="1.0"?>
2 <!--
3     $Id: irspy2zeerex.xsl,v 1.17 2006-12-19 12:54:38 sondberg Exp $
4
5     This stylesheet is used by IRSpy to map the internal mixed Zeerex/IRSpy
6     record format into the Zeerex record which we store.
7
8 -->
9 <xsl:stylesheet
10     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
11     xmlns:irspy="http://indexdata.com/irspy/1.0"
12     xmlns="http://explain.z3950.org/dtd/2.0/"
13     xmlns:explain="http://explain.z3950.org/dtd/2.0/"
14     exclude-result-prefixes="irspy explain"
15     version="1.0">
16
17   <xsl:output indent="yes"
18       method="xml"
19       version="1.0"
20       encoding="UTF-8"/>
21
22   <xsl:strip-space elements="*"/>
23
24   <xsl:variable name="old_indexes" select="/*/explain:indexInfo/explain:index"/>
25   <xsl:variable name="use_attr_names" select="document('use-attr-names.xml')"/>
26   <xsl:variable name="ping_date" select="/*/irspy:status/irspy:probe[last()]"/>
27
28
29   <xsl:template match="/*">
30     <explain>
31       <xsl:call-template name="insert-zeerexBase"/>
32       <xsl:call-template name="insert-indexInfo"/>
33       <xsl:call-template name="insert-recordInfo"/>
34       <xsl:call-template name="insert-configInfo"/>
35       <xsl:call-template name="insert-irspySection"/>
36     </explain>
37   </xsl:template>
38
39
40   <xsl:template name="insert-zeerexBase">
41     <xsl:copy-of select="explain:serverInfo"/>
42     <xsl:copy-of select="explain:databaseInfo"/>
43     <metaInfo>
44       <dateModified><xsl:value-of select="$ping_date"/></dateModified>
45     </metaInfo>
46   </xsl:template>
47
48
49   <xsl:template name="insert-indexInfo">
50     <indexInfo>
51       <xsl:choose>
52
53         <!-- Check that search was actually probed -->
54         <xsl:when test="/*/irspy:status/irspy:search">
55           <xsl:for-each select="/*/irspy:status/irspy:search">
56             <xsl:variable name="set" select="@set"/>
57             <xsl:variable name="ap" select="@ap"/>
58             <xsl:variable name="old"
59                 select="$old_indexes[explain:map/explain:attr/@set = $set and
60                                      explain:map/explain:attr/text() = $ap]"/>
61             <xsl:choose>
62               <xsl:when test="$old">
63                 <xsl:call-template name="insert-index-section">
64                   <xsl:with-param name="title" select="$old/explain:title"/>
65                 </xsl:call-template>
66               </xsl:when>
67               <xsl:otherwise>
68                 <xsl:call-template name="insert-index-section"/>
69               </xsl:otherwise>
70             </xsl:choose>
71           </xsl:for-each>
72         </xsl:when>
73
74         <!-- If not, insert what we already had... -->
75         <xsl:otherwise>
76           <xsl:copy-of select="explain:indexInfo/*"/>
77         </xsl:otherwise>
78       </xsl:choose>
79     </indexInfo>
80   </xsl:template>
81
82
83   <xsl:template name="insert-recordInfo">
84     <recordInfo>
85       <xsl:choose>
86
87         <!-- Did we actually probe record syntaxes? -->
88         <xsl:when test="/*/irspy:status/irspy:record">
89           <xsl:for-each select="/*/irspy:status/irspy:record_fetch[@ok = 1]">
90             <recordSyntax name="{@syntax}">
91               <elementSet name="F"/> <!-- FIXME: This should be probed too -->
92             </recordSyntax>
93           </xsl:for-each>
94         </xsl:when>
95
96         <!-- If not, use the existing test report... -->
97         <xsl:otherwise>
98           <xsl:copy-of select="explain:recordInfo/*"/>
99         </xsl:otherwise>
100       </xsl:choose>
101     </recordInfo>
102   </xsl:template>
103
104
105   <xsl:template name="insert-configInfo">
106     <configInfo>
107       <xsl:choose>
108         <xsl:when test="/*/irspy:status/irspy:init_opt">
109           <xsl:for-each select="/*/irspy:status/irspy:init_opt">
110             <supports type="z3950_{@option}">1</supports>
111           </xsl:for-each>
112         </xsl:when>
113         <xsl:otherwise>
114           <xsl:copy-of select="explain:configInfo/*"/>
115         </xsl:otherwise>
116       </xsl:choose>
117     </configInfo>
118   </xsl:template>
119
120
121   <!-- 
122        Here we list the bits and pieces of the irspy:status element which we
123        want to keep in the persistent version of the zeerex record.
124   -->
125   <xsl:template name="insert-irspySection">
126     <irspy:status>
127       <xsl:copy-of select="*/irspy:probe"/>
128
129       <xsl:call-template name="insert-latest-nodes">
130         <xsl:with-param name="nodes" select="*/irspy:boolean"/>
131         <xsl:with-param name="what" select="'boolean'"/>
132       </xsl:call-template>
133       
134       <xsl:call-template name="insert-latest-nodes">
135         <xsl:with-param name="nodes" select="*/irspy:named_resultset"/>
136         <xsl:with-param name="what" select="'named_resultset'"/>
137       </xsl:call-template>
138       
139       <xsl:call-template name="insert-latest-nodes">
140         <xsl:with-param name="nodes" select="*/irspy:explain"/>
141         <xsl:with-param name="what" select="'explain'"/>
142       </xsl:call-template>
143
144       <xsl:call-template name="insert-latest-nodes">
145         <xsl:with-param name="nodes" select="*/irspy:serverImplementationId"/>
146         <xsl:with-param name="what" select="'serverImplementationId'"/>
147       </xsl:call-template>
148
149       <xsl:call-template name="insert-latest-nodes">
150         <xsl:with-param name="nodes" select="*/irspy:serverImplementationName"/>
151         <xsl:with-param name="what" select="'serverImplementationName'"/>
152       </xsl:call-template>
153
154       <xsl:call-template name="insert-latest-nodes">
155         <xsl:with-param name="nodes"
156                     select="*/irspy:serverImplementationVersion"/>
157         <xsl:with-param name="what" select="'serverImplementationVersion'"/>
158       </xsl:call-template>
159     </irspy:status>
160   </xsl:template>
161
162
163   <!-- 
164        NB: This template assumes that the irspy:probe nodes come in ascending
165        order. If this is not the case, this template has to do some kind of
166        sorting which makes the whole thing more complicated.
167
168        Dec 12, 2006: Anders
169   -->
170   <xsl:template name="insert-latest-nodes">
171     <xsl:param name="nodes"/>
172     <xsl:param name="what" select="'unspecified'"/>
173     <xsl:param name="i" select="count(*/irspy:probe[@ok='1'])"/>
174     <xsl:variable name="date"
175         select="*/irspy:probe[@ok='1' and position() = $i]"/>
176     <xsl:variable name="latest"
177         select="$nodes[irspy:strcmp(text(), $date) > 0]"/>
178
179     <xsl:choose>
180       <xsl:when test="$latest">
181         <xsl:copy-of select="$latest"/>
182       </xsl:when>
183       <xsl:when test="$i > 0">
184         <xsl:call-template name="insert-latest-nodes">
185           <xsl:with-param name="what" select="$what"/>
186           <xsl:with-param name="nodes" select="$nodes"/>
187           <xsl:with-param name="i" select="$i - 1"/>
188         </xsl:call-template>
189       </xsl:when>
190       <xsl:otherwise>
191         <irspy:missing what="{$what}" when="{$ping_date}"/>
192       </xsl:otherwise>
193     </xsl:choose>
194   </xsl:template>
195
196   
197   <xsl:template match="node() | @*">
198     <xsl:copy>
199       <xsl:apply-templates select="@* | node()"/>
200     </xsl:copy>
201   </xsl:template>
202
203
204   <xsl:template name="insert-index-section">
205     <xsl:param name="update" select="."/>
206     <xsl:param name="title">
207       <xsl:call-template name="insert-index-title">
208         <xsl:with-param name="update" select="$update"/>
209       </xsl:call-template>
210     </xsl:param>
211
212     <index>
213       <xsl:attribute name="search">
214         <xsl:choose>
215           <xsl:when test="$update/@ok = 1">true</xsl:when>
216           <xsl:otherwise>false</xsl:otherwise>
217         </xsl:choose>
218       </xsl:attribute>
219       <title primary="true" lang="en">
220         <xsl:value-of select="$title"/>
221       </title>
222       <map primary="true">
223         <attr type="1" set="{$update/@set}">
224           <xsl:value-of select="$update/@ap"/>
225         </attr>
226       </map>
227     </index>
228   </xsl:template>
229
230
231   <xsl:template name="insert-index-title">
232     <xsl:param name="update"/>
233     <xsl:variable name="name"
234                 select="$use_attr_names/*/map[@attr = $update/@ap and
235                                               @set = $update/@set]/@name"/>
236
237     <xsl:choose>
238       <xsl:when test="string-length($name) &gt; 0"><xsl:value-of
239                                             select="$name"/></xsl:when>
240       <xsl:otherwise><xsl:value-of select="$update/@ap"/></xsl:otherwise>
241     </xsl:choose>
242   </xsl:template>
243
244
245   <xsl:template match="*"/>
246
247 </xsl:stylesheet>