]> git.stg.codes - stg.git/blob - doc/xslt/website/olink.xsl
First stage of ticket 10
[stg.git] / doc / xslt / website / olink.xsl
1 <?xml version="1.0"?>
2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3                 version="1.0">
4
5 <xsl:param name="website.database.document"
6            select="'website.database.xml'"/>
7
8 <xsl:template match="olink">
9   <xsl:choose>
10     <xsl:when test="@targetdoc != '' or @targetptr != ''">
11       <xsl:apply-imports/>
12     </xsl:when>
13     <xsl:otherwise>
14       <xsl:call-template name="olink-entity"/>
15     </xsl:otherwise>
16   </xsl:choose>
17 </xsl:template>
18
19 <xsl:template name="olink-entity">
20   <xsl:variable name="xmlfile"
21                 select="document(unparsed-entity-uri(@targetdocent),$autolayout)"/>
22   <xsl:variable name="webpage"
23                 select="$xmlfile/webpage"/>
24   <xsl:variable name="tocentry"
25                 select="$autolayout//*[$webpage/@id=@id]"/>
26
27   <xsl:variable name="dir">
28     <xsl:choose>
29       <xsl:when test="starts-with($tocentry/@dir, '/')">
30         <xsl:value-of select="substring($tocentry/@dir, 2)"/>
31       </xsl:when>
32       <xsl:otherwise>
33         <xsl:value-of select="$tocentry/@dir"/>
34       </xsl:otherwise>
35     </xsl:choose>
36   </xsl:variable>
37
38 <!-- debug
39   <xsl:message>Olink for <xsl:value-of select="unparsed-entity-uri(@targetdocent)"/></xsl:message>
40   <xsl:message>Page id <xsl:value-of select="$webpage/@id"/></xsl:message>
41 -->
42
43   <xsl:choose>
44     <xsl:when test="@type = 'embed'">
45       <xsl:apply-templates select="$xmlfile"/>
46     </xsl:when>
47     <xsl:otherwise>
48       <!-- @type = 'replace' or @type = 'new' -->
49       <a>
50         <xsl:if test="@id">
51           <xsl:attribute name="name">
52             <xsl:value-of select="@id"/>
53           </xsl:attribute>
54         </xsl:if>
55
56 <!-- debug
57         <xsl:message>
58           <xsl:text>href: </xsl:text>
59           <xsl:call-template name="root-rel-path"/>
60           <xsl:text>::</xsl:text>
61           <xsl:value-of select="$dir"/>
62           <xsl:text>::</xsl:text>
63           <xsl:value-of select="$filename-prefix"/>
64           <xsl:text>::</xsl:text>
65           <xsl:value-of select="$tocentry/@filename"/>
66           <xsl:text>::</xsl:text>
67           <xsl:if test="@localinfo">
68             <xsl:text>#</xsl:text>
69             <xsl:value-of select="@localinfo"/>
70           </xsl:if>
71         </xsl:message>
72 -->
73
74         <xsl:attribute name="href">
75           <xsl:call-template name="root-rel-path"/>
76           <xsl:value-of select="$dir"/>
77           <xsl:value-of select="$filename-prefix"/>
78           <xsl:value-of select="$tocentry/@filename"/>
79           <xsl:if test="@localinfo">
80             <xsl:text>#</xsl:text>
81             <xsl:value-of select="@localinfo"/>
82           </xsl:if>
83         </xsl:attribute>
84
85         <xsl:if test="@type = 'new'">
86           <xsl:attribute name="target">_blank</xsl:attribute>
87         </xsl:if>
88
89         <xsl:choose>
90           <xsl:when test="count(node()) = 0">
91             <xsl:apply-templates select="$webpage/head/title"/>
92           </xsl:when>
93           <xsl:otherwise>
94             <xsl:apply-templates/>
95           </xsl:otherwise>
96         </xsl:choose>
97       </a>
98     </xsl:otherwise>
99   </xsl:choose>
100 </xsl:template>
101
102 <!-- Customize the selection to use both website and offsite databases -->
103 <xsl:template name="select.target.database">
104   <xsl:param name="targetdoc.att" select="''"/>
105   <xsl:param name="targetptr.att" select="''"/>
106   <xsl:param name="olink.lang" select="''"/>
107
108   <!-- Is the target in the website database? -->
109   <xsl:variable name="website.olink.key">
110     <xsl:if test="$website.database.document != ''">
111       <xsl:call-template name="select.olink.key">
112         <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
113         <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
114         <xsl:with-param name="olink.lang" select="$olink.lang"/>
115         <xsl:with-param name="target.database" 
116                         select="document($website.database.document,/)"/>
117       </xsl:call-template>
118     </xsl:if>
119   </xsl:variable>
120
121   <!-- Is the target in the offsite database? -->
122   <xsl:variable name="offsite.olink.key">
123     <xsl:if test="$target.database.document != ''">
124       <xsl:call-template name="select.olink.key">
125         <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
126         <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
127         <xsl:with-param name="olink.lang" select="$olink.lang"/>
128         <xsl:with-param name="target.database" 
129                         select="document($target.database.document,/)"/>
130       </xsl:call-template>
131     </xsl:if>
132   </xsl:variable>
133
134   <xsl:choose>
135     <xsl:when test="$website.olink.key != ''">
136       <xsl:value-of select="$website.database.document"/>
137     </xsl:when>
138     <xsl:when test="$offsite.olink.key != ''">
139       <xsl:value-of select="$target.database.document"/>
140     </xsl:when>
141     <xsl:otherwise>
142       <!-- Return a bogus string and let the olink template deal with it
143       <xsl:text>NOMATCHINANYDATABASEDOCUMENT</xsl:text>
144       -->
145     </xsl:otherwise>
146   </xsl:choose>
147 </xsl:template>
148
149 <!-- Customize this template to use Website root-relative -->
150 <xsl:template name="make.olink.href">
151   <xsl:param name="olink.key" select="''"/>
152   <xsl:param name="target.database"/>
153
154   <xsl:if test="$olink.key != ''">
155
156     <xsl:variable name="targetdoc">
157       <xsl:value-of select="substring-before($olink.key, '/')"/>
158     </xsl:variable>
159   
160     <xsl:variable name="targetptr">
161       <xsl:value-of select="substring-before(substring-after($olink.key, '/'),'/')"/>
162     </xsl:variable>
163   
164     <xsl:variable name="target.href" >
165       <xsl:for-each select="$target.database" >
166         <xsl:value-of select="key('targetptr-key', $olink.key)/@href" />
167       </xsl:for-each>
168     </xsl:variable>
169   
170     <xsl:variable name="target.dir" >
171       <xsl:for-each select="$target.database" >
172         <xsl:value-of select="key('targetdoc-key', $targetdoc)/@dir" />
173       </xsl:for-each>
174     </xsl:variable>
175
176     <xsl:variable name="target.element" >
177       <xsl:for-each select="$target.database" >
178         <xsl:value-of select="key('targetptr-key', $olink.key)/@element" />
179       </xsl:for-each>
180     </xsl:variable>
181
182     <!-- Does the target database use a sitemap? -->
183     <xsl:variable name="use.sitemap">
184       <xsl:choose>
185         <xsl:when test="$target.database//sitemap">1</xsl:when>
186         <xsl:otherwise>0</xsl:otherwise>
187       </xsl:choose>
188     </xsl:variable>
189   
190   
191     <!-- Get the baseuri for this targetptr -->
192     <xsl:variable name="baseuri" >
193       <xsl:choose>
194         <!-- Does the database use a sitemap? -->
195         <xsl:when test="$use.sitemap != 0" >
196           <xsl:choose>
197             <!-- Was current.docid parameter set? -->
198             <xsl:when test="$current.docid != ''">
199               <!-- Was it found in the database? -->
200               <xsl:variable name="currentdoc.key" >
201                 <xsl:for-each select="$target.database" >
202                   <xsl:value-of select="key('targetdoc-key',
203                                         $current.docid)/@targetdoc" />
204                 </xsl:for-each>
205               </xsl:variable>
206               <xsl:choose>
207                 <xsl:when test="$currentdoc.key != ''">
208                   <xsl:for-each select="$target.database" >
209                     <xsl:call-template name="targetpath" >
210                       <xsl:with-param name="dirnode" 
211                           select="key('targetdoc-key', $current.docid)/parent::dir"/>
212                       <xsl:with-param name="targetdoc" select="$targetdoc"/>
213                     </xsl:call-template>
214                   </xsl:for-each >
215                 </xsl:when>
216                 <xsl:otherwise>
217                   <xsl:message>
218                     <xsl:text>Olink error: cannot compute relative </xsl:text>
219                     <xsl:text>sitemap path because $current.docid '</xsl:text>
220                     <xsl:value-of select="$current.docid"/>
221                     <xsl:text>' not found in target database.</xsl:text>
222                   </xsl:message>
223                 </xsl:otherwise>
224               </xsl:choose>
225             </xsl:when>
226             <xsl:otherwise>
227               <xsl:message>
228                 <xsl:text>Olink warning: cannot compute relative </xsl:text>
229                 <xsl:text>sitemap path without $current.docid parameter</xsl:text>
230               </xsl:message>
231             </xsl:otherwise>
232           </xsl:choose> 
233           <!-- In either case, add baseuri from its document entry-->
234           <xsl:variable name="docbaseuri">
235             <xsl:for-each select="$target.database" >
236               <xsl:value-of select="key('targetdoc-key', $targetdoc)/@baseuri" />
237             </xsl:for-each>
238           </xsl:variable>
239           <xsl:if test="$docbaseuri != ''" >
240             <xsl:value-of select="$docbaseuri"/>
241           </xsl:if>
242         </xsl:when>
243         <!-- No database sitemap in use -->
244         <xsl:otherwise>
245           <!-- compute a root-relative path if current page has a @dir -->
246           <xsl:variable name="root-rel">
247             <xsl:call-template name="root-rel-path"/>
248           </xsl:variable>
249           <xsl:if test="$root-rel != ''">
250             <xsl:value-of select="$root-rel"/>
251           </xsl:if>
252           <!-- Add the target's @dir to the path -->
253           <xsl:if test="$target.dir != ''">
254             <xsl:value-of select="$target.dir"/>
255           </xsl:if>
256           <!-- Just use any baseuri from its document entry -->
257           <xsl:variable name="docbaseuri">
258             <xsl:for-each select="$target.database" >
259               <xsl:value-of select="key('targetdoc-key',
260                                         $targetdoc)/@baseuri" />
261             </xsl:for-each>
262           </xsl:variable>
263           <xsl:if test="$docbaseuri != ''" >
264             <xsl:value-of select="$docbaseuri"/>
265           </xsl:if>
266         </xsl:otherwise>
267       </xsl:choose>
268     </xsl:variable>
269   
270     <!-- Form the href information -->
271     <xsl:if test="$baseuri != ''">
272       <xsl:value-of select="$baseuri"/>
273       <xsl:if test="substring($target.href,1,1) != '#'">
274         <!--xsl:text>/</xsl:text-->
275       </xsl:if>
276     </xsl:if>
277     <xsl:choose>
278       <xsl:when test="$target.element = 'webpage' and
279                       $targetdoc = $targetptr">
280         <!-- Don't output #id because not needed -->
281       </xsl:when>
282       <!-- optionally turn off frag for PDF references -->
283       <xsl:when test="not($insert.olink.pdf.frag = 0 and
284             translate(substring($baseuri, string-length($baseuri) - 3),
285                       'PDF', 'pdf') = '.pdf'
286             and starts-with($target.href, '#') )">
287         <xsl:value-of select="$target.href"/>
288       </xsl:when>
289       <xsl:otherwise>
290         <xsl:value-of select="$target.href"/>
291       </xsl:otherwise>
292     </xsl:choose>
293   </xsl:if>
294 </xsl:template>
295
296
297 </xsl:stylesheet>