Only select those irspy:xxx entries newer than the status/ping date. Still need
[irspy-moved-to-github.git] / xsl / irspy2zeerex.xsl
1 <?xml version="1.0"?>
2 <!--
3     $Id: irspy2zeerex.xsl,v 1.14 2006-12-11 13:58:17 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:for-each
128           select="*/irspy:probe   |
129                   */irspy:boolean[irspy:strcmp(text(), $ping_date) >= 0] |
130                   */irspy:named_resultset[irspy:strcmp(text(),$ping_date) >= 0]|
131                   */irspy:explain[irspy:strcmp(text(),$ping_date) >= 0]">
132         <xsl:copy-of select="."/>
133       </xsl:for-each>
134     </irspy:status>
135   </xsl:template>
136
137   
138   <xsl:template match="node() | @*">
139     <xsl:copy>
140       <xsl:apply-templates select="@* | node()"/>
141     </xsl:copy>
142   </xsl:template>
143
144
145   <xsl:template name="insert-index-section">
146     <xsl:param name="update" select="."/>
147     <xsl:param name="title">
148       <xsl:call-template name="insert-index-title">
149         <xsl:with-param name="update" select="$update"/>
150       </xsl:call-template>
151     </xsl:param>
152
153     <index>
154       <xsl:attribute name="search">
155         <xsl:choose>
156           <xsl:when test="$update/@ok = 1">true</xsl:when>
157           <xsl:otherwise>false</xsl:otherwise>
158         </xsl:choose>
159       </xsl:attribute>
160       <title primary="true" lang="en">
161         <xsl:value-of select="$title"/>
162       </title>
163       <map primary="true">
164         <attr type="1" set="{$update/@set}">
165           <xsl:value-of select="$update/@ap"/>
166         </attr>
167       </map>
168     </index>
169   </xsl:template>
170
171
172   <xsl:template name="insert-index-title">
173     <xsl:param name="update"/>
174     <xsl:variable name="name"
175                 select="$use_attr_names/*/map[@attr = $update/@ap and
176                                               @set = $update/@set]/@name"/>
177
178     <xsl:choose>
179       <xsl:when test="string-length($name) &gt; 0"><xsl:value-of
180                                             select="$name"/></xsl:when>
181       <xsl:otherwise><xsl:value-of select="$update/@ap"/></xsl:otherwise>
182     </xsl:choose>
183   </xsl:template>
184
185
186   <xsl:template match="*"/>
187
188 </xsl:stylesheet>