Rolling
[irspy-moved-to-github.git] / xsl / irspy2zeerex.xsl
1 <?xml version="1.0"?>
2 <!--
3     $Id: irspy2zeerex.xsl,v 1.11 2006-11-02 11:46:41 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
27
28   <xsl:template match="/*">
29     <explain>
30       <xsl:call-template name="insert-zeerexBase"/>
31       <xsl:call-template name="insert-indexInfo"/>
32       <xsl:call-template name="insert-recordInfo"/>
33       <xsl:call-template name="insert-irspySection"/>
34     </explain>
35   </xsl:template>
36
37
38   <xsl:template name="insert-zeerexBase">
39     <xsl:copy-of select="explain:serverInfo"/>
40     <xsl:copy-of select="explain:databaseInfo"/>
41     <metaInfo>
42       <dateModified><xsl:value-of
43                     select="/*/irspy:status/*[last()]"/></dateModified>
44     </metaInfo>
45   </xsl:template>
46
47
48   <xsl:template name="insert-indexInfo">
49     <indexInfo>
50       <xsl:for-each select="/*/irspy:status/irspy:search">
51         <xsl:variable name="set" select="@set"/>
52         <xsl:variable name="ap" select="@ap"/>
53         <xsl:variable name="old"
54             select="$old_indexes[explain:map/explain:attr/@set = $set and
55                                  explain:map/explain:attr/text() = $ap]"/>
56         <xsl:choose>
57           <xsl:when test="$old">
58             <xsl:call-template name="insert-index-section">
59               <xsl:with-param name="title" select="$old/explain:title"/>
60             </xsl:call-template>
61           </xsl:when>
62           <xsl:otherwise>
63             <xsl:call-template name="insert-index-section"/>
64           </xsl:otherwise>
65         </xsl:choose>
66       </xsl:for-each>
67     </indexInfo>
68   </xsl:template>
69
70
71   <xsl:template name="insert-recordInfo">
72     <recordInfo>
73       <xsl:for-each select="/*/irspy:status/irspy:record_fetch[@ok = 1]">
74         <recordSyntax name="{@syntax}">
75           <elementSet name="F"/> <!-- FIXME: This should be probed too -->
76         </recordSyntax>
77       </xsl:for-each>
78     </recordInfo>
79   </xsl:template>
80
81
82   <!-- 
83        Here we list the bits and pieces of the irspy:status element which we
84        want to keep in the persistent version of the zeerex record.
85        Simply add "| irspy:xxx" to the select attribute.
86   -->
87   <xsl:template name="insert-irspySection">
88     <irspy:status>
89       <xsl:for-each select="*/irspy:probe   |
90                             */irspy:boolean |
91                             */irspy:named_resultset |
92                             */irspy:explain">
93         <xsl:copy-of select="."/>
94       </xsl:for-each>
95     </irspy:status>
96   </xsl:template>
97
98   
99   <xsl:template match="node() | @*">
100     <xsl:copy>
101       <xsl:apply-templates select="@* | node()"/>
102     </xsl:copy>
103   </xsl:template>
104
105
106   <xsl:template name="insert-index-section">
107     <xsl:param name="update" select="."/>
108     <xsl:param name="title">
109       <xsl:call-template name="insert-index-title">
110         <xsl:with-param name="update" select="$update"/>
111       </xsl:call-template>
112     </xsl:param>
113
114     <index>
115       <xsl:attribute name="search">
116         <xsl:choose>
117           <xsl:when test="$update/@ok = 1">true</xsl:when>
118           <xsl:otherwise>false</xsl:otherwise>
119         </xsl:choose>
120       </xsl:attribute>
121       <title primary="true" lang="en">
122         <xsl:value-of select="$title"/>
123       </title>
124       <map primary="true">
125         <attr type="1" set="{$update/@set}">
126           <xsl:value-of select="$update/@ap"/>
127         </attr>
128       </map>
129     </index>
130   </xsl:template>
131
132
133   <xsl:template name="insert-index-title">
134     <xsl:param name="update"/>
135     <xsl:variable name="name"
136                 select="$use_attr_names/*/map[@attr = $update/@ap and
137                                               @set = $update/@set]/@name"/>
138
139     <xsl:choose>
140       <xsl:when test="string-length($name) &gt; 0"><xsl:value-of
141                                             select="$name"/></xsl:when>
142       <xsl:otherwise><xsl:value-of select="$update/@ap"/></xsl:otherwise>
143     </xsl:choose>
144   </xsl:template>
145
146
147   <xsl:template match="*"/>
148
149 </xsl:stylesheet>