source: subversion/utils/osmarender4/osmarender.xsl @ 2188

Last change on this file since 2188 was 2166, checked in by etienne, 13 years ago

Remove hard coded r=1 in circles. Was preventing the size of the centre of circles from being anything but 1px.

File size: 117.1 KB
Line 
1<?xml version="1.0" encoding="UTF-8"?>
2<!--
3==============================================================================
4
5Osmarender
6
7==============================================================================
8
9Copyright (C) 2006-2007  OpenStreetMap Foundation
10
11This program is free software; you can redistribute it and/or modify
12it under the terms of the GNU General Public License as published by
13the Free Software Foundation; either version 2 of the License, or
14(at your option) any later version.
15
16This program is distributed in the hope that it will be useful,
17but WITHOUT ANY WARRANTY; without even the implied warranty of
18MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19GNU General Public License for more details.
20
21You should have received a copy of the GNU General Public License
22along with this program; if not, write to the Free Software
23Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
24
25==============================================================================
26-->
27<xsl:stylesheet xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:cc="http://web.resource.org/cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:date="http://exslt.org/dates-and-times" xmlns:set="http://exslt.org/sets" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" extension-element-prefixes="date set">
28 
29    <xsl:output method="xml" omit-xml-declaration="no" indent="yes" encoding="UTF-8"/>
30
31    <xsl:param name="osmfile" select="/rules/@data"/>
32    <xsl:param name="title" select="/rules/@title"/>
33
34    <xsl:param name="scale" select="/rules/@scale"/>
35    <xsl:param name="symbolScale" select="/rules/@symbolScale"/>
36    <xsl:param name="withOSMLayers" select="/rules/@withOSMLayers"/>
37    <xsl:param name="withUntaggedSegments" select="/rules/@withUntaggedSegments"/>
38    <xsl:param name="svgBaseProfile" select="/rules/@svgBaseProfile"/>
39    <xsl:param name="symbolsDir" select="/rules/@symbolsDir"/>
40
41    <xsl:param name="showGrid" select="/rules/@showGrid"/>
42    <xsl:param name="showBorder" select="/rules/@showBorder"/>
43    <xsl:param name="showScale" select="/rules/@showScale"/>
44    <xsl:param name="showLicense" select="/rules/@showLicense"/>
45
46    <xsl:key name="nodeById" match="/osm/node" use="@id"/>
47    <xsl:key name="segmentById" match="/osm/segment" use="@id"/>
48    <xsl:key name="segmentByFromNode" match="/osm/segment" use="@from"/>
49    <xsl:key name="segmentByToNode" match="/osm/segment" use="@to"/>
50    <xsl:key name="wayBySegment" match="/osm/way" use="seg/@id"/>
51
52    <xsl:variable name="data" select="document($osmfile)"/>
53
54    <!-- extra height for marginalia at top -->
55    <xsl:variable name="marginaliaTopHeight">
56        <xsl:choose>
57            <xsl:when test="$title != ''">40</xsl:when>
58            <xsl:when test="($title = '') and ($showBorder = 'yes')">1.5</xsl:when>
59            <xsl:otherwise>0</xsl:otherwise>
60        </xsl:choose>
61    </xsl:variable>
62
63    <!-- extra height for marginalia at bottom -->
64    <xsl:variable name="marginaliaBottomHeight">
65        <xsl:choose>
66            <xsl:when test="($showScale = 'yes') or ($showLicense = 'yes')">45</xsl:when>
67            <xsl:when test="($showScale != 'yes') and ($showLicense != 'yes') and ($showBorder = 'yes')">1.5</xsl:when>
68            <xsl:otherwise>0</xsl:otherwise>
69        </xsl:choose>
70    </xsl:variable>
71
72    <!-- extra width for border -->
73    <xsl:variable name="extraWidth">
74        <xsl:choose>
75            <xsl:when test="$showBorder = 'yes'">3</xsl:when>
76            <xsl:otherwise>0</xsl:otherwise>
77        </xsl:choose>
78    </xsl:variable>
79
80    <!-- extra height for border -->
81    <xsl:variable name="extraHeight">
82        <xsl:choose>
83            <xsl:when test="($title = '') and ($showBorder = 'yes')">3</xsl:when>
84            <xsl:otherwise>0</xsl:otherwise>
85        </xsl:choose>
86    </xsl:variable>
87
88    <xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="bllat">
89        <xsl:for-each select="$data/osm/node/@lat">
90            <xsl:sort data-type="number" order="ascending"/>
91            <xsl:if test="position()=1">
92                <xsl:value-of select="."/>
93            </xsl:if>
94        </xsl:for-each>
95    </xsl:variable><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="bllon">
96        <xsl:for-each select="$data/osm/node/@lon">
97            <xsl:sort data-type="number" order="ascending"/>
98            <xsl:if test="position()=1">
99                <xsl:value-of select="."/>
100            </xsl:if>
101        </xsl:for-each>
102    </xsl:variable><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="trlat">
103        <xsl:for-each select="$data/osm/node/@lat">
104            <xsl:sort data-type="number" order="descending"/>
105            <xsl:if test="position()=1">
106                <xsl:value-of select="."/>
107            </xsl:if>
108        </xsl:for-each>
109    </xsl:variable><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="trlon">
110        <xsl:for-each select="$data/osm/node/@lon">
111            <xsl:sort data-type="number" order="descending"/>
112            <xsl:if test="position()=1">
113                <xsl:value-of select="."/>
114            </xsl:if>
115        </xsl:for-each>
116    </xsl:variable><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="bottomLeftLatitude">
117        <xsl:choose>
118            <xsl:when test="/rules/bounds">
119                <xsl:value-of select="/rules/bounds/@minlat"/>
120            </xsl:when>
121            <xsl:when test="$data/osm/bounds">
122                <xsl:value-of select="$data/osm/bounds/@request_minlat"/>
123            </xsl:when>
124            <xsl:otherwise>
125                <xsl:value-of select="$bllat"/>
126            </xsl:otherwise>
127        </xsl:choose>
128    </xsl:variable><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="bottomLeftLongitude">
129        <xsl:choose>
130            <xsl:when test="/rules/bounds">
131                <xsl:value-of select="/rules/bounds/@minlon"/>
132            </xsl:when>
133            <xsl:when test="$data/osm/bounds">
134                <xsl:value-of select="$data/osm/bounds/@request_minlon"/>
135            </xsl:when>
136            <xsl:otherwise>
137                <xsl:value-of select="$bllon"/>
138            </xsl:otherwise>
139        </xsl:choose>
140    </xsl:variable><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="topRightLatitude">
141        <xsl:choose>
142            <xsl:when test="/rules/bounds">
143                <xsl:value-of select="/rules/bounds/@maxlat"/>
144            </xsl:when>
145            <xsl:when test="$data/osm/bounds">
146                <xsl:value-of select="$data/osm/bounds/@request_maxlat"/>
147            </xsl:when>
148            <xsl:otherwise>
149                <xsl:value-of select="$trlat"/>
150            </xsl:otherwise>
151        </xsl:choose>
152    </xsl:variable><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="topRightLongitude">
153        <xsl:choose>
154            <xsl:when test="/rules/bounds">
155                <xsl:value-of select="/rules/bounds/@maxlon"/>
156            </xsl:when>
157            <xsl:when test="$data/osm/bounds">
158                <xsl:value-of select="$data/osm/bounds/@request_maxlon"/>
159            </xsl:when>
160            <xsl:otherwise>
161                <xsl:value-of select="$trlon"/>
162            </xsl:otherwise>
163        </xsl:choose>
164    </xsl:variable><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="middleLatitude" select="($topRightLatitude + $bottomLeftLatitude) div 2.0"/><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="latr" select="$middleLatitude * 3.1415926 div 180.0"/><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="coslat" select="1 - ($latr * $latr) div 2 + ($latr * $latr * $latr * $latr) div 24"/><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="projection" select="1 div $coslat"/><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="dataWidth" select="(number($topRightLongitude)-number($bottomLeftLongitude))*10000*$scale"/><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="dataHeight" select="(number($topRightLatitude)-number($bottomLeftLatitude))*10000*$scale*$projection"/><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="km" select="(0.0089928*$scale*10000*$projection)"/><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="documentWidth">
165        <xsl:choose>
166            <xsl:when test="$dataWidth &gt; (number(/rules/@minimumMapWidth) * $km)">
167                <xsl:value-of select="$dataWidth"/>
168            </xsl:when>
169            <xsl:otherwise><xsl:value-of select="number(/rules/@minimumMapWidth) * $km"/></xsl:otherwise>
170        </xsl:choose>
171    </xsl:variable><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="documentHeight">
172        <xsl:choose>
173            <xsl:when test="$dataHeight &gt; (number(/rules/@minimumMapHeight) * $km)">
174                <xsl:value-of select="$dataHeight"/>
175            </xsl:when>
176            <xsl:otherwise><xsl:value-of select="number(/rules/@minimumMapHeight) * $km"/></xsl:otherwise>
177        </xsl:choose>
178    </xsl:variable><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="width" select="($documentWidth div 2) + ($dataWidth div 2)"/><xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="height" select="($documentHeight div 2) + ($dataHeight div 2)"/>
179
180    <!-- Main template -->
181    <xsl:template match="/rules">     
182
183        <!-- Include an external css stylesheet if one was specified in the rules file -->
184        <xsl:if test="@xml-stylesheet">
185            <xsl:processing-instruction name="xml-stylesheet">
186                href="<xsl:value-of select="@xml-stylesheet"/>" type="text/css"
187            </xsl:processing-instruction>
188        </xsl:if>
189
190        <xsl:variable name="svgWidth" select="$documentWidth + $extraWidth"/>
191        <xsl:variable name="svgHeight" select="$documentHeight + $marginaliaTopHeight + $marginaliaBottomHeight"/>
192
193        <svg id="main" version="1.1" baseProfile="{$svgBaseProfile}" width="{$svgWidth}px" height="{$svgHeight}px" viewBox="{-$extraWidth div 2} {-$extraHeight div 2} {$svgWidth} {$svgHeight}">
194            <xsl:if test="/rules/@interactive=&quot;yes&quot;">
195                <xsl:attribute name="onscroll">fnOnScroll(evt)</xsl:attribute>
196                <xsl:attribute name="onzoom">fnOnZoom(evt)</xsl:attribute>
197                <xsl:attribute name="onload">fnOnLoad(evt)</xsl:attribute>
198                <xsl:attribute name="onmousedown">fnOnMouseDown(evt)</xsl:attribute>
199                <xsl:attribute name="onmousemove">fnOnMouseMove(evt)</xsl:attribute>
200                <xsl:attribute name="onmouseup">fnOnMouseUp(evt)</xsl:attribute>
201            </xsl:if>
202
203            <xsl:call-template name="metadata"/>
204
205            <!-- Include javaScript functions for all the dynamic stuff --> 
206            <xsl:if test="/rules/@interactive=&quot;yes&quot;">
207                <xsl:call-template name="javaScript"/>
208            </xsl:if>
209
210            <defs id="defs-rulefile">
211                <!-- Get any <defs> and styles from the rules file -->
212                <xsl:copy-of select="defs/*"/>
213            </defs>
214
215            <xsl:if test="$symbolsDir != ''">
216                <!-- Get all symbols mentioned in the rules file from the symbolsDir -->
217                <defs id="defs-symbols">
218                    <xsl:for-each select="/rules//symbol/@ref">
219                        <xsl:copy-of select="document(concat($symbolsDir,'/', ., '.svg'))/svg:svg/svg:defs/svg:symbol"/>
220                    </xsl:for-each>
221                </defs>
222            </xsl:if>
223
224            <!-- Pre-generate named path definitions for all ways -->
225            <xsl:variable name="allWays" select="$data/osm/way"/>
226            <defs id="defs-ways">
227                <xsl:for-each select="$allWays">
228                    <xsl:call-template name="generateWayPath"/>
229                </xsl:for-each>
230            </defs>
231
232            <!-- Clipping rectangle for map -->
233            <clipPath id="map-clipping">
234                <rect id="map-clipping-rect" x="0px" y="0px" height="{$documentHeight}px" width="{$documentWidth}px"/>
235            </clipPath>
236
237            <g id="map" clip-path="url(#map-clipping)" inkscape:groupmode="layer" inkscape:label="Map" transform="translate(0,{$marginaliaTopHeight})">
238                <!-- Draw a nice background layer -->
239                <rect id="background" x="0px" y="0px" height="{$documentHeight}px" width="{$documentWidth}px" class="map-background"/>
240
241                <!-- If this is set we first draw all untagged segments not belonging to any way -->
242                <xsl:if test="$withUntaggedSegments=&quot;yes&quot;">
243                    <xsl:call-template name="drawUntaggedSegments"/>
244                </xsl:if>
245
246                <!-- Process all the rules drawing all map features -->
247                <xsl:call-template name="processRules"/>
248            </g>
249
250            <!-- Draw map decoration -->
251            <g id="map-decoration" inkscape:groupmode="layer" inkscape:label="Map decoration" transform="translate(0,{$marginaliaTopHeight})">
252                <!-- Draw a grid if required -->
253                <xsl:if test="$showGrid=&quot;yes&quot;">
254                    <xsl:call-template name="gridDraw"/>
255                </xsl:if>
256
257                <!-- Draw a border if required -->
258                <xsl:if test="$showBorder=&quot;yes&quot;">
259                    <xsl:call-template name="borderDraw"/>
260                </xsl:if>
261            </g>
262
263            <!-- Draw map marginalia -->
264            <xsl:if test="($title != '') or ($showScale = 'yes') or ($showLicense = 'yes')">
265                <g id="marginalia" inkscape:groupmode="layer" inkscape:label="Marginalia">
266                    <!-- Draw the title -->
267                    <xsl:if test="$title!=''">
268                        <xsl:call-template name="titleDraw">
269                            <xsl:with-param name="title" select="$title"/>
270                        </xsl:call-template>
271                    </xsl:if>
272
273                    <xsl:if test="($showScale = 'yes') or ($showLicense = 'yes')">
274                        <g id="marginalia-bottom" inkscape:groupmode="layer" inkscape:label="Marginalia (Bottom)" transform="translate(0,{$marginaliaTopHeight})">
275                            <!-- Draw background for marginalia at bottom -->
276                            <rect id="marginalia-background" x="0px" y="{$documentHeight + 5}px" height="40px" width="{$documentWidth}px" class="map-marginalia-background"/>
277
278                            <!-- Draw the scale in the bottom left corner -->
279                            <xsl:if test="$showScale=&quot;yes&quot;">
280                                <xsl:call-template name="scaleDraw"/>
281                            </xsl:if>
282
283                            <!-- Draw Creative commons license -->
284                            <xsl:if test="$showLicense=&quot;yes&quot;">
285                                <xsl:call-template name="in-image-license">
286                                    <xsl:with-param name="year" select="2007"/>
287                                    <xsl:with-param name="dx" select="$documentWidth"/>
288                                    <xsl:with-param name="dy" select="$documentHeight"/>
289                                </xsl:call-template>
290                            </xsl:if>
291                        </g>
292                    </xsl:if>
293                </g>
294            </xsl:if>
295
296            <!-- Draw labels and controls that are in a static position -->
297            <g id="staticElements" transform="scale(1) translate(0,0)">
298                <!-- Draw the +/- zoom controls -->
299                <xsl:if test="/rules/@interactive=&quot;yes&quot;">
300                    <xsl:call-template name="zoomControl"/>
301                </xsl:if>
302            </g>
303        </svg>
304
305    </xsl:template>
306
307    <!-- include templates from all the other files -->
308    <xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" name="drawLine">
309        <xsl:param name="instruction"/>
310        <xsl:param name="segment"/> <!-- The current segment element -->
311        <xsl:param name="way"/>  <!-- The current way element if applicable -->
312
313        <xsl:variable name="from" select="@from"/>
314        <xsl:variable name="to" select="@to"/>
315        <xsl:variable name="fromNode" select="key(&quot;nodeById&quot;,$from)"/>
316        <xsl:variable name="toNode" select="key(&quot;nodeById&quot;,$to)"/>
317        <xsl:variable name="fromNodeContinuation" select="(count(key(&quot;segmentByFromNode&quot;,$fromNode/@id))+count(key(&quot;segmentByToNode&quot;,$fromNode/@id)))&gt;1"/>
318        <xsl:variable name="toNodeContinuation" select="(count(key(&quot;segmentByFromNode&quot;,$toNode/@id))+count(key(&quot;segmentByToNode&quot;,$toNode/@id)))&gt;1"/>
319
320        <xsl:variable name="x1" select="($width)-((($topRightLongitude)-($fromNode/@lon))*10000*$scale)"/>
321        <xsl:variable name="y1" select="($height)+((($bottomLeftLatitude)-($fromNode/@lat))*10000*$scale*$projection)"/>
322        <xsl:variable name="x2" select="($width)-((($topRightLongitude)-($toNode/@lon))*10000*$scale)"/>
323        <xsl:variable name="y2" select="($height)+((($bottomLeftLatitude)-($toNode/@lat))*10000*$scale*$projection)"/>
324
325        <!-- If this is not the end of a path then draw a stub line with a rounded linecap at the from-node end -->
326        <xsl:if test="$fromNodeContinuation">
327            <xsl:call-template name="drawSegmentFragment">
328                <xsl:with-param name="x1" select="$x1"/>
329                <xsl:with-param name="y1" select="$y1"/>
330                <xsl:with-param name="x2" select="number($x1)+((number($x2)-number($x1)) div 10)"/>
331                <xsl:with-param name="y2" select="number($y1)+((number($y2)-number($y1)) div 10)"/>
332            </xsl:call-template>
333        </xsl:if>
334
335        <!-- If this is not the end of a path then draw a stub line with a rounded linecap at the to-node end -->
336        <xsl:if test="$toNodeContinuation">
337            <xsl:call-template name="drawSegmentFragment">
338                <xsl:with-param name="x1" select="number($x2)-((number($x2)-number($x1)) div 10)"/>
339                <xsl:with-param name="y1" select="number($y2)-((number($y2)-number($y1)) div 10)"/>
340                <xsl:with-param name="x2" select="$x2"/>
341                <xsl:with-param name="y2" select="$y2"/>
342            </xsl:call-template>
343        </xsl:if>
344
345        <line>
346            <xsl:attribute name="x1"><xsl:value-of select="$x1"/></xsl:attribute>
347            <xsl:attribute name="y1"><xsl:value-of select="$y1"/></xsl:attribute>
348            <xsl:attribute name="x2"><xsl:value-of select="$x2"/></xsl:attribute>
349            <xsl:attribute name="y2"><xsl:value-of select="$y2"/></xsl:attribute>
350            <xsl:call-template name="getSvgAttributesFromOsmTags"/>
351        </line>
352
353    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" name="drawSegmentFragment">
354        <xsl:param name="x1"/>
355        <xsl:param name="x2"/>
356        <xsl:param name="y1"/>
357        <xsl:param name="y2"/>
358            <line>
359                <xsl:attribute name="x1"><xsl:value-of select="$x1"/></xsl:attribute>
360                <xsl:attribute name="y1"><xsl:value-of select="$y1"/></xsl:attribute>
361                <xsl:attribute name="x2"><xsl:value-of select="$x2"/></xsl:attribute>
362                <xsl:attribute name="y2"><xsl:value-of select="$y2"/></xsl:attribute>
363                <!-- add the rounded linecap attribute -->
364                <xsl:attribute name="stroke-linecap">round</xsl:attribute>
365                <!-- suppress any markers else these could be drawn in the wrong place -->
366                <xsl:attribute name="marker-start">none</xsl:attribute>
367                <xsl:attribute name="marker-end">none</xsl:attribute>
368                <xsl:call-template name="getSvgAttributesFromOsmTags"/>
369            </line>
370    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" name="drawWay">
371        <xsl:param name="instruction"/>
372        <xsl:param name="way"/>  <!-- The current way element if applicable -->
373        <xsl:param name="layer"/>
374        <xsl:param name="classes"/>
375
376        <xsl:variable name="tunnel" select="$way/tag[@k='tunnel']"/>
377        <xsl:variable name="railway" select="$way/tag[@k='railway' and @v='rail']"/>
378
379        <xsl:if test="not($tunnel and ($tunnel/@v = 'yes') or ($tunnel/@v = 'true'))">  <!-- if this is not a tunnel -->
380
381            <xsl:if test="not($railway)">
382
383                <!-- For the first and last segments in the way if the start or end is a continuation, then draw a round-capped stub segment
384                        that is 1/10th the length of the segment and without any markers.  TODO: do this for all sub-paths within the path.
385                    Count the number of segments that link to the from node of this segment.  Only count them if they belong to a way that
386                    has a layer tag that is greater than the layer of this way.  If there are any such segments then draw rounded
387                    end fragments. -->
388                <!-- Process the first segment in the way -->
389                <xsl:variable name="firstSegment" select="key(&quot;segmentById&quot;,$way/seg[1]/@id)"/>
390                <xsl:variable name="firstSegmentFromNode" select="key(&quot;nodeById&quot;,$firstSegment/@from)"/>
391                <xsl:variable name="firstSegmentToNode" select="key(&quot;nodeById&quot;,$firstSegment/@to)"/>
392                <xsl:variable name="firstSegmentInboundLayerCount" select="count(key(&quot;wayBySegment&quot;,key(&quot;segmentByToNode&quot;,$firstSegmentFromNode/@id)/@id)/tag[@k=&quot;layer&quot; and @v &gt;= $layer])"/>
393                <xsl:variable name="firstSegmentInboundNoLayerCount" select="count(key(&quot;wayBySegment&quot;,key(&quot;segmentByToNode&quot;,$firstSegmentFromNode/@id)/@id)[count(tag[@k=&quot;layer&quot;])=0 and $layer &lt; 1])"/>
394                <xsl:variable name="firstSegmentOutboundLayerCount" select="count(key(&quot;wayBySegment&quot;,key(&quot;segmentByFromNode&quot;,$firstSegmentFromNode/@id)/@id)/tag[@k=&quot;layer&quot; and @v &gt;= $layer])"/>
395                <xsl:variable name="firstSegmentOutboundNoLayerCount" select="count(key(&quot;wayBySegment&quot;,key(&quot;segmentByFromNode&quot;,$firstSegmentFromNode/@id)/@id)[count(tag[@k=&quot;layer&quot;])=0 and $layer &lt; 1])"/>
396                <xsl:variable name="firstSegmentLayerCount" select="($firstSegmentInboundLayerCount+$firstSegmentInboundNoLayerCount+$firstSegmentOutboundLayerCount+$firstSegmentOutboundNoLayerCount)&gt;1"/>
397
398                <xsl:if test="$firstSegmentLayerCount">
399                    <xsl:variable name="x1" select="($width)-((($topRightLongitude)-($firstSegmentFromNode/@lon))*10000*$scale)"/>
400                    <xsl:variable name="y1" select="($height)+((($bottomLeftLatitude)-($firstSegmentFromNode/@lat))*10000*$scale*$projection)"/>
401                    <xsl:variable name="x2" select="($width)-((($topRightLongitude)-($firstSegmentToNode/@lon))*10000*$scale)"/>
402                    <xsl:variable name="y2" select="($height)+((($bottomLeftLatitude)-($firstSegmentToNode/@lat))*10000*$scale*$projection)"/>
403                    <xsl:call-template name="drawSegmentFragment">
404                        <xsl:with-param name="x1" select="$x1"/>
405                        <xsl:with-param name="y1" select="$y1"/>
406                        <xsl:with-param name="x2" select="number($x1)+((number($x2)-number($x1)) div 10)"/>
407                        <xsl:with-param name="y2" select="number($y1)+((number($y2)-number($y1)) div 10)"/>
408                    </xsl:call-template>
409                </xsl:if>
410
411                <!-- Process the last segment in the way -->
412                <xsl:variable name="lastSegment" select="key(&quot;segmentById&quot;,$way/seg[last()]/@id)"/>
413                <xsl:variable name="lastSegmentFromNode" select="key(&quot;nodeById&quot;,$lastSegment/@from)"/>
414                <xsl:variable name="lastSegmentToNode" select="key(&quot;nodeById&quot;,$lastSegment/@to)"/>
415                <xsl:variable name="lastSegmentToNodeLayer" select="(count(key(&quot;segmentByFromNode&quot;,$lastSegmentToNode/@id)[@k=&quot;layer&quot; and @v &gt; $layer])+count(key(&quot;segmentByToNode&quot;,$lastSegmentToNode/@id)[@k=&quot;layer&quot; and @v &gt; $layer]))&gt;0"/>
416                <xsl:variable name="lastSegmentInboundLayerCount" select="count(key(&quot;wayBySegment&quot;,key(&quot;segmentByToNode&quot;,$lastSegmentToNode/@id)/@id)/tag[@k=&quot;layer&quot; and @v &gt;= $layer])"/>
417                <xsl:variable name="lastSegmentInboundNoLayerCount" select="count(key(&quot;wayBySegment&quot;,key(&quot;segmentByToNode&quot;,$lastSegmentToNode/@id)/@id)[count(tag[@k=&quot;layer&quot;])=0 and $layer &lt; 1])"/>
418                <xsl:variable name="lastSegmentOutboundLayerCount" select="count(key(&quot;wayBySegment&quot;,key(&quot;segmentByFromNode&quot;,$lastSegmentToNode/@id)/@id)/tag[@k=&quot;layer&quot; and @v &gt;= $layer])"/>
419                <xsl:variable name="lastSegmentOutboundNoLayerCount" select="count(key(&quot;wayBySegment&quot;,key(&quot;segmentByFromNode&quot;,$lastSegmentToNode/@id)/@id)[count(tag[@k=&quot;layer&quot;])=0 and $layer &lt; 1])"/>
420                <xsl:variable name="lastSegmentLayerCount" select="($lastSegmentInboundLayerCount+$lastSegmentInboundNoLayerCount+$lastSegmentOutboundLayerCount+$lastSegmentOutboundNoLayerCount)&gt;1"/>
421
422                <xsl:if test="$lastSegmentLayerCount">
423                    <xsl:variable name="x1" select="($width)-((($topRightLongitude)-($lastSegmentFromNode/@lon))*10000*$scale)"/>
424                    <xsl:variable name="y1" select="($height)+((($bottomLeftLatitude)-($lastSegmentFromNode/@lat))*10000*$scale*$projection)"/>
425                    <xsl:variable name="x2" select="($width)-((($topRightLongitude)-($lastSegmentToNode/@lon))*10000*$scale)"/>
426                    <xsl:variable name="y2" select="($height)+((($bottomLeftLatitude)-($lastSegmentToNode/@lat))*10000*$scale*$projection)"/>
427                    <xsl:call-template name="drawSegmentFragment">
428                        <xsl:with-param name="x1" select="number($x2)-((number($x2)-number($x1)) div 10)"/>
429                        <xsl:with-param name="y1" select="number($y2)-((number($y2)-number($y1)) div 10)"/>
430                        <xsl:with-param name="x2" select="$x2"/>
431                        <xsl:with-param name="y2" select="$y2"/>
432                    </xsl:call-template>
433                </xsl:if>
434            </xsl:if>
435
436            <!-- Now draw the way itself -->
437            <use xlink:href="#way_{$way/@id}">
438                <xsl:apply-templates select="$instruction/@*" mode="copyAttributes">
439                    <xsl:with-param name="classes" select="$classes"/>
440                </xsl:apply-templates>
441            </use>
442        </xsl:if>
443
444    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" name="drawTunnel">
445        <xsl:param name="instruction"/>
446        <xsl:param name="way"/>
447        <xsl:param name="layer"/>
448        <xsl:param name="classes"/>
449
450        <xsl:choose>
451            <xsl:when test="$instruction/@width &gt; 0">
452                <!-- wide tunnels use a dashed line as wide as the road casing with a mask as wide as the road core which will be
453                rendered as a double dotted line -->
454                <mask id="mask_{@id}" maskUnits="userSpaceOnUse">
455                    <use xlink:href="#way_{@id}" style="stroke:black;fill:none;" class="{$instruction/@class}-core"/>
456                    <rect x="0px" y="0px" height="{$documentHeight}px" width="{$documentWidth}px" style="fill:white;"/>
457                </mask>
458                <use xlink:href="#way_{$way/@id}" mask="url(#mask_{@id})" style="stroke-dasharray:0.2,0.2;" class="{$instruction/@class}-casing"/>
459                <use xlink:href="#way_{$way/@id}" class="tunnel-casing" style="stroke-width:{$instruction/@width}px;"/>
460            </xsl:when>
461            <xsl:otherwise>
462                <!-- narrow tunnels will use a single dotted line -->
463                <use xlink:href="#way_{$way/@id}">
464                    <xsl:apply-templates select="$instruction/@*" mode="copyAttributes">
465                        <xsl:with-param name="classes" select="$classes"/>
466                    </xsl:apply-templates>
467                </use>
468            </xsl:otherwise>
469        </xsl:choose>
470    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" name="drawCircle">
471        <xsl:param name="instruction"/>
472
473        <xsl:variable name="x" select="($width)-((($topRightLongitude)-(@lon))*10000*$scale)"/>
474        <xsl:variable name="y" select="($height)+((($bottomLeftLatitude)-(@lat))*10000*$scale*$projection)"/>
475
476        <circle cx="{$x}" cy="{$y}">
477            <xsl:apply-templates select="$instruction/@*" mode="copyAttributes"/> <!-- Copy all the svg attributes from the <circle> instruction -->
478        </circle>
479
480    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" name="drawSymbol">
481        <xsl:param name="instruction"/>
482
483        <xsl:variable name="x" select="($width)-((($topRightLongitude)-(@lon))*10000*$scale)"/>
484        <xsl:variable name="y" select="($height)+((($bottomLeftLatitude)-(@lat))*10000*$scale*$projection)"/>
485
486        <g transform="translate({$x},{$y}) scale({$symbolScale})">
487            <use width="1" height="1">
488                <xsl:if test="$instruction/@ref">
489                    <xsl:attribute name="xlink:href">
490                        <xsl:value-of select="concat('#symbol-', $instruction/@ref)"/>
491                    </xsl:attribute>
492                </xsl:if>
493                <xsl:apply-templates select="$instruction/@*" mode="copyAttributes"/> <!-- Copy all the attributes from the <symbol> instruction -->
494            </use>
495        </g>
496    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" name="renderText">
497        <xsl:param name="instruction"/>
498
499        <xsl:variable name="x" select="($width)-((($topRightLongitude)-(@lon))*10000*$scale)"/>
500        <xsl:variable name="y" select="($height)+((($bottomLeftLatitude)-(@lat))*10000*$scale*$projection)"/>
501
502        <text>
503            <xsl:apply-templates select="$instruction/@*" mode="copyAttributes"/>
504            <xsl:attribute name="x"><xsl:value-of select="$x"/></xsl:attribute>
505            <xsl:attribute name="y"><xsl:value-of select="$y"/></xsl:attribute>
506            <xsl:call-template name="getSvgAttributesFromOsmTags"/>
507            <xsl:value-of select="tag[@k=$instruction/@k]/@v"/>
508        </text>
509    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" name="renderTextPath">
510        <xsl:param name="instruction"/>
511        <xsl:param name="pathId"/>
512        <text>
513            <xsl:apply-templates select="$instruction/@*" mode="renderTextPath-text"/>
514            <textPath xlink:href="#{$pathId}">
515                <xsl:apply-templates select="$instruction/@*" mode="renderTextPath-textPath"/>
516                <xsl:call-template name="getSvgAttributesFromOsmTags"/>
517                <xsl:value-of select="tag[@k=$instruction/@k]/@v"/>
518            </textPath>
519        </text>
520    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="@startOffset|@method|@spacing|@lengthAdjust|@textLength|@k" mode="renderTextPath-text">
521    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="@*" mode="renderTextPath-text">
522        <xsl:copy/>
523    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="@startOffset|@method|@spacing|@lengthAdjust|@textLength" mode="renderTextPath-textPath">
524        <xsl:copy/>
525    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="@*" mode="renderTextPath-textPath">
526    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" name="renderArea">
527        <xsl:param name="instruction"/>
528        <xsl:param name="pathId"/>
529
530        <use xlink:href="#{$pathId}">
531            <xsl:apply-templates select="$instruction/@*" mode="copyAttributes"/>
532        </use>
533    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="getSvgAttributesFromOsmTags">
534        <xsl:for-each select="tag[contains(@k,&quot;svg:&quot;)]">
535            <xsl:attribute name="{substring-after(@k,&quot;svg:&quot;)}"><xsl:value-of select="@v"/></xsl:attribute>
536        </xsl:for-each>
537    </xsl:template>
538    <xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" name="drawUntaggedSegments">
539        <g id="segments" inkscape:groupmode="layer" inkscape:label="Segments">
540            <xsl:for-each select="$data/osm/segment[not(key('wayBySegment', @id))]">
541                <xsl:if test="not(tag[@key!='created_by'])">
542                    <xsl:variable name="fromNode" select="key('nodeById', @from)"/>
543                    <xsl:variable name="toNode" select="key('nodeById', @to)"/>
544                    <xsl:variable name="x1" select="($width)-((($topRightLongitude)-($fromNode/@lon))*10000*$scale)"/>
545                    <xsl:variable name="y1" select="($height)+((($bottomLeftLatitude)-($fromNode/@lat))*10000*$scale*$projection)"/>
546                    <xsl:variable name="x2" select="($width)-((($topRightLongitude)-($toNode/@lon))*10000*$scale)"/>
547                    <xsl:variable name="y2" select="($height)+((($bottomLeftLatitude)-($toNode/@lat))*10000*$scale*$projection)"/>
548                    <line class="untagged-segments" x1="{$x1}" y1="{$y1}" x2="{$x2}" y2="{$y2}"/>
549                </xsl:if>
550            </xsl:for-each>
551        </g>
552    </xsl:template>
553    <xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" match="line">
554        <xsl:param name="elements"/>
555        <xsl:param name="layer"/>
556        <xsl:param name="classes"/>
557
558        <!-- This is the instruction that is currently being processed -->
559        <xsl:variable name="instruction" select="."/>
560
561        <g>
562            <xsl:apply-templates select="@*" mode="copyAttributes"> <!-- Add all the svg attributes of the <line> instruction to the <g> element -->
563                <xsl:with-param name="classes" select="$classes"/>
564            </xsl:apply-templates>
565
566            <!-- For each segment and way -->
567            <xsl:apply-templates select="$elements" mode="line">
568                <xsl:with-param name="instruction" select="$instruction"/>
569                <xsl:with-param name="layer" select="$layer"/>
570                <xsl:with-param name="classes" select="$classes"/>
571            </xsl:apply-templates>
572
573        </g>
574    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="*" mode="line"/><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="segment" mode="line">
575        <xsl:param name="instruction"/>
576        <xsl:param name="classes"/>
577
578        <xsl:call-template name="drawLine">
579            <xsl:with-param name="instruction" select="$instruction"/>
580            <xsl:with-param name="segment" select="."/>
581            <xsl:with-param name="classes" select="$classes"/>
582        </xsl:call-template>
583
584    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="way" mode="line">
585        <xsl:param name="instruction"/>
586        <xsl:param name="layer"/>
587        <xsl:param name="classes"/>
588
589        <!-- The current <way> element -->
590        <xsl:variable name="way" select="."/>
591
592        <xsl:call-template name="drawWay">
593            <xsl:with-param name="instruction" select="$instruction"/>
594            <xsl:with-param name="way" select="$way"/>
595            <xsl:with-param name="layer" select="$layer"/>
596            <xsl:with-param name="classes" select="$classes"/>
597        </xsl:call-template>
598
599    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" match="tunnel">
600        <xsl:param name="elements"/>
601        <xsl:param name="layer"/>
602        <xsl:param name="classes"/>
603
604        <!-- This is the instruction that is currently being processed -->
605        <xsl:variable name="instruction" select="."/>
606
607        <g>
608            <xsl:apply-templates select="@*" mode="copyAttributes"> <!-- Add all the svg attributes of the <tunnel> instruction to the <g> element -->
609                <xsl:with-param name="classes" select="$classes"/>
610            </xsl:apply-templates>
611
612            <!-- For each segment and way -->
613            <xsl:apply-templates select="$elements" mode="tunnel">
614                <xsl:with-param name="instruction" select="$instruction"/>
615                <xsl:with-param name="layer" select="$layer"/>
616                <xsl:with-param name="classes" select="$classes"/>
617            </xsl:apply-templates>
618        </g>
619    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="way" mode="tunnel">
620        <xsl:param name="instruction"/>
621        <xsl:param name="layer"/>
622        <xsl:param name="classes"/>
623
624        <!-- The current <way> element -->
625        <xsl:variable name="way" select="."/>
626
627        <xsl:call-template name="drawTunnel">
628            <xsl:with-param name="instruction" select="$instruction"/>
629            <xsl:with-param name="way" select="$way"/>
630            <xsl:with-param name="layer" select="$layer"/>
631            <xsl:with-param name="classes" select="$classes"/>
632        </xsl:call-template>
633
634    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" match="area">
635        <xsl:param name="elements"/>
636        <xsl:param name="classes"/>
637
638        <!-- This is the instruction that is currently being processed -->
639        <xsl:variable name="instruction" select="."/>
640
641        <g>
642            <xsl:apply-templates select="@*" mode="copyAttributes"/> <!-- Add all the svg attributes of the <line> instruction to the <g> element -->
643
644            <!-- For each segment and way -->
645            <xsl:apply-templates select="$elements" mode="area">
646                <xsl:with-param name="instruction" select="$instruction"/>
647            </xsl:apply-templates>
648        </g>
649    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="*" mode="area"/><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="way" mode="area">
650        <xsl:param name="instruction"/>
651
652        <xsl:call-template name="generateAreaPath"/>
653
654        <xsl:call-template name="renderArea">
655            <xsl:with-param name="instruction" select="$instruction"/>
656            <xsl:with-param name="pathId" select="concat(&quot;area_&quot;,@id)"/>
657        </xsl:call-template>
658
659    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="circle">
660        <xsl:param name="elements"/>
661        <xsl:param name="classes"/>
662
663        <!-- This is the instruction that is currently being processed -->
664        <xsl:variable name="instruction" select="."/>
665
666        <xsl:for-each select="$elements[name()=&quot;node&quot;]">
667            <xsl:call-template name="drawCircle">
668                <xsl:with-param name="instruction" select="$instruction"/>
669            </xsl:call-template>
670        </xsl:for-each>
671    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="symbol">
672        <xsl:param name="elements"/>
673        <xsl:param name="classes"/>
674
675        <!-- This is the instruction that is currently being processed -->
676        <xsl:variable name="instruction" select="."/>
677
678        <xsl:for-each select="$elements[name()=&quot;node&quot;]">
679            <xsl:call-template name="drawSymbol">
680                <xsl:with-param name="instruction" select="$instruction"/>
681            </xsl:call-template>
682        </xsl:for-each>
683    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="text">
684        <xsl:param name="elements"/>
685        <xsl:param name="classes"/>
686
687        <!-- This is the instruction that is currently being processed -->
688        <xsl:variable name="instruction" select="."/>
689
690        <!-- Select all <node> elements that have a key that matches the k attribute of the text instruction -->
691        <xsl:for-each select="$elements[name()=&quot;node&quot;][tag[@k=$instruction/@k]]">
692                <xsl:call-template name="renderText">
693                    <xsl:with-param name="instruction" select="$instruction"/>
694                </xsl:call-template>
695        </xsl:for-each>
696
697        <!-- Select all <segment> and <way> elements that have a key that matches the k attribute of the text instruction -->
698        <xsl:apply-templates select="$elements[name()=&quot;segment&quot; or name()=&quot;way&quot;][tag[@k=$instruction/@k]]" mode="textPath">
699            <xsl:with-param name="instruction" select="$instruction"/>
700        </xsl:apply-templates>
701    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="*" mode="textPath"/><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="segment" mode="textPath">
702        <xsl:param name="instruction"/>
703
704        <!-- The current <segment> element -->
705        <xsl:variable name="segment" select="."/>
706
707        <!-- Generate the path for the segment -->
708        <!-- Text on segments should be relatively uncommon so only generate a <path> when one is needed -->
709        <xsl:call-template name="generateSegmentPath"/>
710
711        <xsl:call-template name="renderTextPath">
712            <xsl:with-param name="instruction" select="$instruction"/>
713            <xsl:with-param name="pathId" select="concat(&quot;segment_&quot;,@id)"/>
714        </xsl:call-template>
715
716    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="way" mode="textPath">
717        <xsl:param name="instruction"/>
718
719        <!-- The current <way> element -->
720        <xsl:variable name="way" select="."/>
721
722        <xsl:call-template name="renderTextPath">
723            <xsl:with-param name="instruction" select="$instruction"/>
724            <xsl:with-param name="pathId" select="concat(&quot;way_&quot;,@id,&quot;t&quot;)"/>
725        </xsl:call-template>
726
727    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" name="generateSegmentPath">
728        <xsl:variable name="pathData">
729            <xsl:choose>
730                                <!-- Manual override -->
731                <xsl:when test="tag[@k=&quot;name_direction&quot;]/@v=&quot;-1&quot; or tag[@k=&quot;osmarender:nameDirection&quot;]/@v=&quot;-1&quot;">
732                    <xsl:call-template name="segmentMoveToEnd"/>
733                    <xsl:call-template name="segmentLineToStart"/>
734                </xsl:when>
735                <xsl:when test="tag[@k=&quot;name_direction&quot;]/@v=&quot;1&quot; or tag[@k=&quot;osmarender:nameDirection&quot;]/@v=&quot;1&quot;">
736                    <xsl:call-template name="segmentMoveToStart"/>
737                    <xsl:call-template name="segmentLineToEnd"/>
738                </xsl:when>
739                <!-- Automatic direction -->
740                <xsl:when test="(key(&quot;nodeById&quot;,@from)/@lon &gt; key(&quot;nodeById&quot;,@to)/@lon)">
741                    <xsl:call-template name="segmentMoveToEnd"/>
742                    <xsl:call-template name="segmentLineToStart"/>
743                </xsl:when>
744                <xsl:otherwise>
745                    <xsl:call-template name="segmentMoveToStart"/>
746                    <xsl:call-template name="segmentLineToEnd"/>
747                </xsl:otherwise>
748            </xsl:choose>
749        </xsl:variable>
750
751        <path id="segment_{@id}" d="{$pathData}"/>
752
753    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" name="generateWayPath">
754
755        <!-- Generate the path for the way that will be used by the street
756        name rendering. This is horribly inefficient, because we will later
757        also have the path used for the rendering of the path itself. So
758        each path is twice in the SVG file. But this path here needs to
759        have the right direction for the names to render right way up
760        and the other path needs to be the right direction for rendering
761        the oneway arrows. This can probably be done better, but currently
762        I don't know how. -->
763        <xsl:variable name="pathData">
764            <xsl:choose>
765                                <!-- Manual override, reverse direction -->
766                <xsl:when test="tag[@k=&quot;name_direction&quot;]/@v=&quot;-1&quot; or tag[@k=&quot;osmarender:nameDirection&quot;]/@v=&quot;-1&quot;">
767                                        <xsl:call-template name="generateWayPathReverse"/>
768                </xsl:when>
769                                <!-- Manual override, normal direction -->
770                <xsl:when test="tag[@k=&quot;name_direction&quot;]/@v=&quot;1&quot; or tag[@k=&quot;osmarender:nameDirection&quot;]/@v=&quot;1&quot;">
771                                        <xsl:call-template name="generateWayPathNormal"/>
772                </xsl:when>
773                                <!-- Automatic, reverse direction -->
774                <xsl:when test="(key(&quot;nodeById&quot;,key(&quot;segmentById&quot;,seg[1]/@id)/@from)/@lon &gt; key(&quot;nodeById&quot;,key(&quot;segmentById&quot;,seg[last()]/@id)/@to)/@lon)">
775                                        <xsl:call-template name="generateWayPathReverse"/>
776                </xsl:when>
777                                <!-- Automatic, normal direction -->
778                <xsl:otherwise>
779                                        <xsl:call-template name="generateWayPathNormal"/>
780                </xsl:otherwise>
781            </xsl:choose>
782        </xsl:variable>
783
784        <path id="way_{@id}t" d="{$pathData}"/>
785
786        <!-- Generate the path for the way itself. Used for rendering the
787        way and, possibly, oneway arrows. -->
788        <xsl:variable name="pathDataFixed">
789                        <xsl:call-template name="generateWayPathNormal"/>
790        </xsl:variable>
791
792        <path id="way_{@id}" d="{$pathDataFixed}"/>
793
794    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="generateWayPathNormal">
795        <xsl:for-each select="seg[key(&quot;segmentById&quot;,@id)]">
796            <xsl:variable name="segmentId" select="@id"/>
797            <xsl:variable name="linkedSegment" select="key(&quot;segmentById&quot;,@id)/@from=key(&quot;segmentById&quot;,preceding-sibling::seg[1]/@id)/@to"/>
798            <xsl:for-each select="key(&quot;segmentById&quot;,$segmentId)">
799                <xsl:if test="not($linkedSegment)">
800                    <xsl:call-template name="segmentMoveToStart"/>
801                </xsl:if>
802                    <xsl:call-template name="segmentLineToEnd"/>
803            </xsl:for-each>
804        </xsl:for-each>
805    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="generateWayPathReverse">
806                <xsl:for-each select="seg">
807                    <xsl:sort select="position()" data-type="number" order="descending"/>
808                    <xsl:variable name="segmentId" select="@id"/>
809                    <xsl:variable name="linkedSegment" select="key(&quot;segmentById&quot;,following-sibling::seg[1]/@id)/@from=key(&quot;segmentById&quot;,@id)/@to"/>
810                    <xsl:for-each select="key(&quot;segmentById&quot;,$segmentId)">
811                        <xsl:if test="not($linkedSegment)">
812                            <xsl:call-template name="segmentMoveToEnd"/>
813                        </xsl:if>
814                            <xsl:call-template name="segmentLineToStart"/>
815                    </xsl:for-each>
816                </xsl:for-each>   
817    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" name="generateAreaPath">
818
819                <!-- Generate the path for the area -->
820                <xsl:variable name="pathData">
821                        <xsl:for-each select="seg[key(&quot;segmentById&quot;,@id)]">
822                                <xsl:variable name="segmentId" select="@id"/>
823                                <xsl:variable name="currentSegmentToNodeId" select="key(&quot;segmentById&quot;,@id)/@to"/>
824                                <xsl:variable name="currentSegmentFromNodeId" select="key(&quot;segmentById&quot;,@id)/@from"/>
825                                <xsl:variable name="previousSegmentToNodeId" select="key(&quot;segmentById&quot;,preceding-sibling::seg[1]/@id)/@to"/>
826                               
827                                <!-- The linkedSegment flag indicates whether the previous segment is connected to the current segment.  If it isn't
828                                     then we will need to draw an additional line (segmentLineToStart) from the end of the previous segment to the
829                                     start of the current segment.
830                                -->
831                                <xsl:variable name="linkedSegment" select="key(&quot;segmentById&quot;,@id)/@from=$previousSegmentToNodeId"/>
832               
833                                <!--  Now we count the number of segments in this way that have a to node that is equal to the current segment's from node.
834                                      We do this to find out if the current segment is connected from some other segment in the way.  If it is, and it
835                                      is not linked to the current segment then we can assume we have the start of a new sub-path.  In this case we shouldn't
836                                      draw an additional line between the end of the previous segment and the start of the current segment.
837                                -->
838                                <xsl:variable name="connectedSegmentCount" select="count(../*[key(&quot;segmentById&quot;,@id)/@to=$currentSegmentFromNodeId])"/>
839                               
840                                <xsl:variable name="segmentSequence" select="position()"/>
841                                <xsl:for-each select="key(&quot;segmentById&quot;,$segmentId)">
842                                        <xsl:choose>
843                                                <!-- If this is the start of the way then we always have to move to the start of the segment. -->
844                                                <xsl:when test="$segmentSequence=1">
845                                                        <xsl:call-template name="segmentMoveToStart"/>                         
846                                                </xsl:when>
847                                                <!-- If the segment is "connected" to another segment (at the from end) but is not linked to the
848                                                         previous segment, then start a new sub-path -->
849                                                <xsl:when test="$connectedSegmentCount&gt;0 and not($linkedSegment)">
850                                                        <xsl:text>Z</xsl:text>
851                                                        <xsl:call-template name="segmentMoveToStart"/>                         
852                                                </xsl:when>
853                                                <!-- If the previous segment is not linked to this one we need to draw an artificial line -->
854                                                <xsl:when test="not($linkedSegment)">
855                                                        <xsl:call-template name="segmentLineToStart"/>                         
856                                                </xsl:when>
857                                        </xsl:choose>
858                                        <xsl:call-template name="segmentLineToEnd"/>
859                                </xsl:for-each>
860                        </xsl:for-each>
861                        <xsl:text>Z</xsl:text>
862                </xsl:variable>
863
864                <path id="area_{@id}" d="{$pathData}"/>
865
866        </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="segmentMoveToStart">
867        <xsl:variable name="from" select="@from"/>
868        <xsl:variable name="fromNode" select="key(&quot;nodeById&quot;,$from)"/>
869
870        <xsl:variable name="x1" select="($width)-((($topRightLongitude)-($fromNode/@lon))*10000*$scale)"/>
871        <xsl:variable name="y1" select="($height)+((($bottomLeftLatitude)-($fromNode/@lat))*10000*$scale*$projection)"/>
872        <xsl:text>M</xsl:text>
873        <xsl:value-of select="$x1"/>
874        <xsl:text> </xsl:text>
875        <xsl:value-of select="$y1"/>
876    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="segmentLineToStart">
877        <xsl:variable name="from" select="@from"/>
878        <xsl:variable name="fromNode" select="key(&quot;nodeById&quot;,$from)"/>
879
880        <xsl:variable name="x1" select="($width)-((($topRightLongitude)-($fromNode/@lon))*10000*$scale)"/>
881        <xsl:variable name="y1" select="($height)+((($bottomLeftLatitude)-($fromNode/@lat))*10000*$scale*$projection)"/>
882        <xsl:text>L</xsl:text>
883        <xsl:value-of select="$x1"/>
884        <xsl:text> </xsl:text>
885        <xsl:value-of select="$y1"/>
886    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="segmentMoveToEnd">
887        <xsl:variable name="to" select="@to"/>
888        <xsl:variable name="toNode" select="key(&quot;nodeById&quot;,$to)"/>
889
890        <xsl:variable name="x2" select="($width)-((($topRightLongitude)-($toNode/@lon))*10000*$scale)"/>
891        <xsl:variable name="y2" select="($height)+((($bottomLeftLatitude)-($toNode/@lat))*10000*$scale*$projection)"/>
892        <xsl:text>M</xsl:text>
893        <xsl:value-of select="$x2"/>
894        <xsl:text> </xsl:text>
895        <xsl:value-of select="$y2"/>
896    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="segmentLineToEnd">
897        <xsl:variable name="to" select="@to"/>
898        <xsl:variable name="toNode" select="key(&quot;nodeById&quot;,$to)"/>
899
900        <xsl:variable name="x2" select="($width)-((($topRightLongitude)-($toNode/@lon))*10000*$scale)"/>
901        <xsl:variable name="y2" select="($height)+((($bottomLeftLatitude)-($toNode/@lat))*10000*$scale*$projection)"/>
902        <xsl:text>L</xsl:text>
903        <xsl:value-of select="$x2"/>
904        <xsl:text> </xsl:text>
905        <xsl:value-of select="$y2"/>
906    </xsl:template>
907    <xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="@class" mode="copyAttributes">
908        <xsl:param name="classes"/>
909        <xsl:attribute name="class">
910            <xsl:value-of select="normalize-space(concat($classes,' ',.))"/>
911        </xsl:attribute>
912    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="@type|@ref|@scale" mode="copyAttributes">
913    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="@*" mode="copyAttributes">
914        <xsl:param name="classes"/>
915        <xsl:copy/>
916    </xsl:template>
917
918    <xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="processRules">
919     
920        <xsl:choose>
921
922            <!-- Process all the rules, one layer at a time -->
923            <xsl:when test="$withOSMLayers='yes'">
924                <xsl:call-template name="processLayer"><xsl:with-param name="layer" select="&quot;-5&quot;"/></xsl:call-template>
925                <xsl:call-template name="processLayer"><xsl:with-param name="layer" select="&quot;-4&quot;"/></xsl:call-template>
926                <xsl:call-template name="processLayer"><xsl:with-param name="layer" select="&quot;-3&quot;"/></xsl:call-template>
927                <xsl:call-template name="processLayer"><xsl:with-param name="layer" select="&quot;-2&quot;"/></xsl:call-template>
928                <xsl:call-template name="processLayer"><xsl:with-param name="layer" select="&quot;-1&quot;"/></xsl:call-template>
929                <xsl:call-template name="processLayer">
930                    <xsl:with-param name="layer" select="&quot;0&quot;"/>
931                    <xsl:with-param name="elements" select="$data/osm/*[not(@action=&quot;delete&quot;) and count(tag[@k=&quot;layer&quot;])=0 or tag[@k=&quot;layer&quot; and @v=&quot;0&quot;]]"/>
932                </xsl:call-template>
933                <xsl:call-template name="processLayer"><xsl:with-param name="layer" select="&quot;1&quot;"/></xsl:call-template>
934                <xsl:call-template name="processLayer"><xsl:with-param name="layer" select="&quot;2&quot;"/></xsl:call-template>
935                <xsl:call-template name="processLayer"><xsl:with-param name="layer" select="&quot;3&quot;"/></xsl:call-template>
936                <xsl:call-template name="processLayer"><xsl:with-param name="layer" select="&quot;4&quot;"/></xsl:call-template>
937                <xsl:call-template name="processLayer"><xsl:with-param name="layer" select="&quot;5&quot;"/></xsl:call-template>
938            </xsl:when>
939
940            <!-- Process all the rules, without looking at the layers -->
941            <xsl:otherwise>
942                <xsl:apply-templates select="/rules/rule">
943                    <xsl:with-param name="elements" select="$data/osm/*[not(@action=&quot;delete&quot;)]"/>
944                    <xsl:with-param name="layer" select="&quot;0&quot;"/>
945                    <xsl:with-param name="classes" select="''"/>
946                </xsl:apply-templates>
947            </xsl:otherwise>
948
949        </xsl:choose>
950        </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" name="processLayer">
951        <xsl:param name="layer"/>
952        <xsl:param name="elements" select="$data/osm/*[not(@action=&quot;delete&quot;) and tag[@k=&quot;layer&quot; and @v=$layer]]"/>
953
954        <g inkscape:groupmode="layer" id="layer{$layer}" inkscape:label="Layer {$layer}">
955            <xsl:apply-templates select="/rules/rule">
956                <xsl:with-param name="elements" select="$elements"/>
957                <xsl:with-param name="layer" select="$layer"/>
958                <xsl:with-param name="classes" select="''"/>
959            </xsl:apply-templates>
960        </g>
961    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="rule">
962        <xsl:param name="elements"/>
963        <xsl:param name="layer"/>
964        <xsl:param name="classes"/>
965
966        <!-- This is the rule currently being processed -->
967        <xsl:variable name="rule" select="."/>
968
969        <!-- Make list of elements that this rule should be applied to -->
970        <xsl:variable name="eBare">
971            <xsl:choose>
972                <xsl:when test="$rule/@e=&quot;*&quot;">node|segment|way</xsl:when>
973                <xsl:when test="$rule/@e"><xsl:value-of select="$rule/@e"/></xsl:when>
974                <xsl:otherwise>node|segment|way</xsl:otherwise>
975            </xsl:choose>
976        </xsl:variable>
977
978        <!-- List of keys that this rule should be applied to -->
979        <xsl:variable name="kBare" select="$rule/@k"/>
980
981        <!-- List of values that this rule should be applied to -->
982        <xsl:variable name="vBare" select="$rule/@v"/>
983
984        <!-- Top'n'tail selectors with | for contains usage -->
985        <xsl:variable name="e">|<xsl:value-of select="$eBare"/>|</xsl:variable>
986        <xsl:variable name="k">|<xsl:value-of select="$kBare"/>|</xsl:variable>
987        <xsl:variable name="v">|<xsl:value-of select="$vBare"/>|</xsl:variable>
988
989        <xsl:variable name="selectedElements" select="$elements[contains($e,concat(&quot;|&quot;,name(),&quot;|&quot;))or (contains($e,&quot;|waysegment|&quot;) and name()=&quot;segment&quot; and key(&quot;wayBySegment&quot;,@id))]"/>
990
991        <xsl:choose>
992            <xsl:when test="contains($k,&quot;|*|&quot;)">
993                <xsl:choose>
994                    <xsl:when test="contains($v,&quot;|~|&quot;)">
995                        <xsl:variable name="elementsWithNoTags" select="$selectedElements[count(tag)=0]"/>
996                        <xsl:call-template name="processElements">
997                            <xsl:with-param name="eBare" select="$eBare"/>
998                            <xsl:with-param name="kBare" select="$kBare"/>
999                            <xsl:with-param name="vBare" select="$vBare"/>
1000                            <xsl:with-param name="layer" select="$layer"/>
1001                            <xsl:with-param name="elements" select="$elementsWithNoTags"/>
1002                            <xsl:with-param name="rule" select="$rule"/>
1003                            <xsl:with-param name="classes" select="$classes"/>
1004                        </xsl:call-template>
1005                    </xsl:when>
1006                    <xsl:when test="contains($v,&quot;|*|&quot;)">
1007                        <xsl:variable name="allElements" select="$selectedElements"/>
1008                        <xsl:call-template name="processElements">
1009                            <xsl:with-param name="eBare" select="$eBare"/>
1010                            <xsl:with-param name="kBare" select="$kBare"/>
1011                            <xsl:with-param name="vBare" select="$vBare"/>
1012                            <xsl:with-param name="layer" select="$layer"/>
1013                            <xsl:with-param name="elements" select="$allElements"/>
1014                            <xsl:with-param name="rule" select="$rule"/>
1015                            <xsl:with-param name="classes" select="$classes"/>
1016                        </xsl:call-template>
1017                    </xsl:when>
1018                    <xsl:otherwise>
1019                        <xsl:variable name="allElementsWithValue" select="$selectedElements[tag[contains($v,concat(&quot;|&quot;,@v,&quot;|&quot;))]]"/>
1020                        <xsl:call-template name="processElements">
1021                            <xsl:with-param name="eBare" select="$eBare"/>
1022                            <xsl:with-param name="kBare" select="$kBare"/>
1023                            <xsl:with-param name="vBare" select="$vBare"/>
1024                            <xsl:with-param name="layer" select="$layer"/>
1025                            <xsl:with-param name="elements" select="$allElementsWithValue"/>
1026                            <xsl:with-param name="rule" select="$rule"/>
1027                            <xsl:with-param name="classes" select="$classes"/>
1028                        </xsl:call-template>
1029                    </xsl:otherwise>
1030                </xsl:choose>
1031            </xsl:when>
1032            <xsl:when test="contains($v,&quot;|~|&quot;)">
1033                <xsl:variable name="elementsWithoutKey" select="$selectedElements[count(tag[contains($k,concat(&quot;|&quot;,@k,&quot;|&quot;))])=0]"/>
1034                <xsl:call-template name="processElements">
1035                    <xsl:with-param name="eBare" select="$eBare"/>
1036                    <xsl:with-param name="kBare" select="$kBare"/>
1037                    <xsl:with-param name="vBare" select="$vBare"/>
1038                    <xsl:with-param name="layer" select="$layer"/>
1039                    <xsl:with-param name="elements" select="$elementsWithoutKey"/>
1040                    <xsl:with-param name="rule" select="$rule"/>
1041                    <xsl:with-param name="classes" select="$classes"/>
1042                </xsl:call-template>
1043            </xsl:when>
1044            <xsl:when test="contains($v,&quot;|*|&quot;)">
1045                <xsl:variable name="allElementsWithKey" select="$selectedElements[tag[contains($k,concat(&quot;|&quot;,@k,&quot;|&quot;))]]"/>
1046                <xsl:call-template name="processElements">
1047                    <xsl:with-param name="eBare" select="$eBare"/>
1048                    <xsl:with-param name="kBare" select="$kBare"/>
1049                    <xsl:with-param name="vBare" select="$vBare"/>
1050                    <xsl:with-param name="layer" select="$layer"/>
1051                    <xsl:with-param name="elements" select="$allElementsWithKey"/>
1052                    <xsl:with-param name="rule" select="$rule"/>
1053                    <xsl:with-param name="classes" select="$classes"/>
1054                </xsl:call-template>
1055            </xsl:when>
1056            <xsl:otherwise>
1057                <xsl:variable name="elementsWithKey" select="$selectedElements[tag[contains($k,concat(&quot;|&quot;,@k,&quot;|&quot;)) and contains($v,concat(&quot;|&quot;,@v,&quot;|&quot;))]]"/>
1058                <xsl:call-template name="processElements">
1059                    <xsl:with-param name="eBare" select="$eBare"/>
1060                    <xsl:with-param name="kBare" select="$kBare"/>
1061                    <xsl:with-param name="vBare" select="$vBare"/>
1062                    <xsl:with-param name="layer" select="$layer"/>
1063                    <xsl:with-param name="elements" select="$elementsWithKey"/>
1064                    <xsl:with-param name="rule" select="$rule"/>
1065                    <xsl:with-param name="classes" select="$classes"/>
1066                </xsl:call-template>
1067            </xsl:otherwise>
1068        </xsl:choose>
1069    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="processElements">
1070        <xsl:param name="eBare"/>
1071        <xsl:param name="kBare"/>
1072        <xsl:param name="vBare"/>
1073        <xsl:param name="layer"/>
1074        <xsl:param name="elements"/>
1075        <xsl:param name="rule"/>
1076        <xsl:param name="classes"/>
1077       
1078        <xsl:if test="$elements">
1079            <xsl:message>
1080Processing &lt;rule e="<xsl:value-of select="$eBare"/>" k="<xsl:value-of select="$kBare"/>" v="<xsl:value-of select="$vBare"/>" &gt; 
1081Matched by <xsl:value-of select="count($elements)"/> elements for layer <xsl:value-of select="$layer"/>.
1082            </xsl:message>
1083
1084            <xsl:apply-templates select="*">
1085                <xsl:with-param name="layer" select="$layer"/>
1086                <xsl:with-param name="elements" select="$elements"/>
1087                <xsl:with-param name="rule" select="$rule"/>
1088                <xsl:with-param name="classes" select="$classes"/>
1089            </xsl:apply-templates>
1090        </xsl:if>
1091    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="addclass">
1092        <xsl:param name="elements"/>
1093        <xsl:param name="layer"/>
1094        <xsl:param name="classes"/>
1095
1096        <!-- This is the rule currently being processed -->
1097        <xsl:variable name="rule" select="."/>
1098
1099        <!-- Additional classes from class attribute of this rule -->
1100        <xsl:variable name="addclasses" select="@class"/>
1101
1102        <!-- Make list of elements that this rule should be applied to -->
1103        <xsl:variable name="eBare">
1104            <xsl:choose>
1105                <xsl:when test="$rule/@e=&quot;*&quot;">node|segment|way</xsl:when>
1106                <xsl:when test="$rule/@e"><xsl:value-of select="$rule/@e"/></xsl:when>
1107                <xsl:otherwise>node|segment|way</xsl:otherwise>
1108            </xsl:choose>
1109        </xsl:variable>
1110
1111        <!-- List of keys that this rule should be applied to -->
1112        <xsl:variable name="kBare" select="$rule/@k"/>
1113
1114        <!-- List of values that this rule should be applied to -->
1115        <xsl:variable name="vBare" select="$rule/@v"/>
1116
1117        <!-- Top'n'tail selectors with | for contains usage -->
1118        <xsl:variable name="e">|<xsl:value-of select="$eBare"/>|</xsl:variable>
1119        <xsl:variable name="k">|<xsl:value-of select="$kBare"/>|</xsl:variable>
1120        <xsl:variable name="v">|<xsl:value-of select="$vBare"/>|</xsl:variable>
1121
1122        <xsl:variable name="selectedElements" select="$elements[contains($e,concat(&quot;|&quot;,name(),&quot;|&quot;))or (contains($e,&quot;|waysegment|&quot;) and name()=&quot;segment&quot; and key(&quot;wayBySegment&quot;,@id))]"/>
1123
1124        <xsl:choose>
1125            <xsl:when test="contains($k,&quot;|*|&quot;)">
1126                <xsl:choose>
1127                    <xsl:when test="contains($v,&quot;|~|&quot;)">
1128                        <xsl:variable name="elementsWithNoTags" select="$selectedElements[count(tag)=0]"/>
1129                        <xsl:call-template name="processElementsForAddClass">
1130                            <xsl:with-param name="eBare" select="$eBare"/>
1131                            <xsl:with-param name="kBare" select="$kBare"/>
1132                            <xsl:with-param name="vBare" select="$vBare"/>
1133                            <xsl:with-param name="layer" select="$layer"/>
1134                            <xsl:with-param name="elements" select="$elementsWithNoTags"/>
1135                            <xsl:with-param name="rule" select="$rule"/>
1136                            <xsl:with-param name="classes" select="$classes"/>
1137                            <xsl:with-param name="addclasses" select="$addclasses"/>
1138                            <xsl:with-param name="allelements" select="$elements"/>
1139                        </xsl:call-template>
1140                    </xsl:when>
1141                    <xsl:when test="contains($v,&quot;|*|&quot;)">
1142                        <xsl:variable name="allElements" select="$selectedElements"/>
1143                        <xsl:call-template name="processElementsForAddClass">
1144                            <xsl:with-param name="eBare" select="$eBare"/>
1145                            <xsl:with-param name="kBare" select="$kBare"/>
1146                            <xsl:with-param name="vBare" select="$vBare"/>
1147                            <xsl:with-param name="layer" select="$layer"/>
1148                            <xsl:with-param name="elements" select="$allElements"/>
1149                            <xsl:with-param name="rule" select="$rule"/>
1150                            <xsl:with-param name="classes" select="$classes"/>
1151                            <xsl:with-param name="addclasses" select="$addclasses"/>
1152                            <xsl:with-param name="allelements" select="$elements"/>
1153                        </xsl:call-template>
1154                    </xsl:when>
1155                    <xsl:otherwise>
1156                        <xsl:variable name="allElementsWithValue" select="$selectedElements[tag[contains($v,concat(&quot;|&quot;,@v,&quot;|&quot;))]]"/>
1157                        <xsl:call-template name="processElementsForAddClass">
1158                            <xsl:with-param name="eBare" select="$eBare"/>
1159                            <xsl:with-param name="kBare" select="$kBare"/>
1160                            <xsl:with-param name="vBare" select="$vBare"/>
1161                            <xsl:with-param name="layer" select="$layer"/>
1162                            <xsl:with-param name="elements" select="$allElementsWithValue"/>
1163                            <xsl:with-param name="rule" select="$rule"/>
1164                            <xsl:with-param name="classes" select="$classes"/>
1165                            <xsl:with-param name="addclasses" select="$addclasses"/>
1166                            <xsl:with-param name="allelements" select="$elements"/>
1167                        </xsl:call-template>
1168                    </xsl:otherwise>
1169                </xsl:choose>
1170            </xsl:when>
1171            <xsl:when test="contains($v,&quot;|~|&quot;)">
1172                <xsl:variable name="elementsWithoutKey" select="$selectedElements[count(tag[contains($k,concat(&quot;|&quot;,@k,&quot;|&quot;))])=0]"/>
1173                <xsl:call-template name="processElementsForAddClass">
1174                    <xsl:with-param name="eBare" select="$eBare"/>
1175                    <xsl:with-param name="kBare" select="$kBare"/>
1176                    <xsl:with-param name="vBare" select="$vBare"/>
1177                    <xsl:with-param name="layer" select="$layer"/>
1178                    <xsl:with-param name="elements" select="$elementsWithoutKey"/>
1179                    <xsl:with-param name="rule" select="$rule"/>
1180                    <xsl:with-param name="classes" select="$classes"/>
1181                    <xsl:with-param name="addclasses" select="$addclasses"/>
1182                    <xsl:with-param name="allelements" select="$elements"/>
1183                </xsl:call-template>
1184            </xsl:when>
1185            <xsl:when test="contains($v,&quot;|*|&quot;)">
1186                <xsl:variable name="allElementsWithKey" select="$selectedElements[tag[contains($k,concat(&quot;|&quot;,@k,&quot;|&quot;))]]"/>
1187                <xsl:call-template name="processElementsForAddClass">
1188                    <xsl:with-param name="eBare" select="$eBare"/>
1189                    <xsl:with-param name="kBare" select="$kBare"/>
1190                    <xsl:with-param name="vBare" select="$vBare"/>
1191                    <xsl:with-param name="layer" select="$layer"/>
1192                    <xsl:with-param name="elements" select="$allElementsWithKey"/>
1193                    <xsl:with-param name="rule" select="$rule"/>
1194                    <xsl:with-param name="classes" select="$classes"/>
1195                    <xsl:with-param name="addclasses" select="$addclasses"/>
1196                    <xsl:with-param name="allelements" select="$elements"/>
1197                </xsl:call-template>
1198            </xsl:when>
1199            <xsl:otherwise>
1200                <xsl:variable name="elementsWithKey" select="$selectedElements[tag[contains($k,concat(&quot;|&quot;,@k,&quot;|&quot;)) and contains($v,concat(&quot;|&quot;,@v,&quot;|&quot;))]]"/>
1201                <xsl:call-template name="processElementsForAddClass">
1202                    <xsl:with-param name="eBare" select="$eBare"/>
1203                    <xsl:with-param name="kBare" select="$kBare"/>
1204                    <xsl:with-param name="vBare" select="$vBare"/>
1205                    <xsl:with-param name="layer" select="$layer"/>
1206                    <xsl:with-param name="elements" select="$elementsWithKey"/>
1207                    <xsl:with-param name="rule" select="$rule"/>
1208                    <xsl:with-param name="classes" select="$classes"/>
1209                    <xsl:with-param name="addclasses" select="$addclasses"/>
1210                    <xsl:with-param name="allelements" select="$elements"/>
1211                </xsl:call-template>
1212            </xsl:otherwise>
1213        </xsl:choose>
1214    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="processElementsForAddClass">
1215        <xsl:param name="eBare"/>
1216        <xsl:param name="kBare"/>
1217        <xsl:param name="vBare"/>
1218        <xsl:param name="layer"/>
1219        <xsl:param name="elements"/>
1220        <xsl:param name="allelements"/>
1221        <xsl:param name="rule"/>
1222        <xsl:param name="classes"/>
1223        <xsl:param name="addclasses"/>
1224       
1225        <xsl:variable name="newclasses" select="concat($classes,' ',$addclasses)"/>
1226        <xsl:variable name="otherelements" select="set:difference($allelements, $elements)"/>
1227
1228        <xsl:if test="$elements">
1229            <xsl:message>
1230Processing &lt;addclass e="<xsl:value-of select="$eBare"/>" k="<xsl:value-of select="$kBare"/>" v="<xsl:value-of select="$vBare"/>" &gt; 
1231Positive match by <xsl:value-of select="count($elements)"/> elements for layer <xsl:value-of select="$layer"/>.
1232            </xsl:message>
1233
1234            <xsl:apply-templates select="*">
1235                <xsl:with-param name="layer" select="$layer"/>
1236                <xsl:with-param name="elements" select="$elements"/>
1237                <xsl:with-param name="rule" select="$rule"/>
1238                <xsl:with-param name="classes" select="$newclasses"/>
1239            </xsl:apply-templates>
1240        </xsl:if>
1241
1242        <xsl:if test="$otherelements">
1243            <xsl:message>
1244Processing &lt;addclass e="<xsl:value-of select="$eBare"/>" k="<xsl:value-of select="$kBare"/>" v="<xsl:value-of select="$vBare"/>" &gt; 
1245Negative match by <xsl:value-of select="count($otherelements)"/> elements for layer <xsl:value-of select="$layer"/>.
1246            </xsl:message>
1247            <xsl:apply-templates select="*">
1248                <xsl:with-param name="layer" select="$layer"/>
1249                <xsl:with-param name="elements" select="$otherelements"/>
1250                <xsl:with-param name="rule" select="$rule"/>
1251                <xsl:with-param name="classes" select="$classes"/>
1252            </xsl:apply-templates>
1253        </xsl:if>
1254    </xsl:template>
1255    <xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" match="layer">
1256        <xsl:param name="elements"/>
1257        <xsl:param name="layer"/>
1258        <xsl:param name="rule"/>
1259        <xsl:param name="classes"/>
1260
1261        <xsl:message>Processing SVG layer: <xsl:value-of select="@name"/> (at OSM layer <xsl:value-of select="$layer"/>)
1262</xsl:message>
1263
1264        <xsl:variable name="opacity">
1265            <xsl:if test="@opacity">
1266                <xsl:value-of select="concat('opacity:',@opacity,';')"/>
1267            </xsl:if>
1268        </xsl:variable>
1269
1270        <xsl:variable name="display">
1271            <xsl:if test="(@display='none') or (@display='off')">
1272                <xsl:text>display:none;</xsl:text>
1273            </xsl:if>
1274        </xsl:variable>
1275
1276        <g inkscape:groupmode="layer" id="{@name}-{$layer}" inkscape:label="{@name}">
1277            <xsl:if test="concat($opacity,$display)!=''">
1278                <xsl:attribute name="style">
1279                    <xsl:value-of select="concat($opacity,$display)"/>
1280                </xsl:attribute>
1281            </xsl:if>
1282            <xsl:apply-templates select="*">
1283                <xsl:with-param name="layer" select="$layer"/>
1284                <xsl:with-param name="elements" select="$elements"/>
1285                <xsl:with-param name="classes" select="$classes"/>
1286            </xsl:apply-templates>
1287        </g>
1288
1289    </xsl:template>
1290   
1291    <xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" name="borderDraw">
1292        <!-- dasharray definitions here can be overridden in stylesheet -->
1293        <g id="border" inkscape:groupmode="layer" inkscape:label="Map Border">
1294            <line id="border-left-casing" x1="0" y1="0" x2="0" y2="{$documentHeight}" class="map-border-casing" stroke-dasharray="{($km div 10) - 1},1"/>
1295            <line id="border-top-casing" x1="0" y1="0" x2="{$documentWidth}" y2="0" class="map-border-casing" stroke-dasharray="{($km div 10) - 1},1"/>
1296            <line id="border-bottom-casing" x1="0" y1="{$documentHeight}" x2="{$documentWidth}" y2="{$documentHeight}" class="map-border-casing" stroke-dasharray="{($km div 10) - 1},1"/>
1297            <line id="border-right-casing" x1="{$documentWidth}" y1="0" x2="{$documentWidth}" y2="{$documentHeight}" class="map-border-casing" stroke-dasharray="{($km div 10) - 1},1"/>
1298
1299            <line id="border-left-core" x1="0" y1="0" x2="0" y2="{$documentHeight}" class="map-border-core" stroke-dasharray="{($km div 10) - 1},1"/>
1300            <line id="border-top-core" x1="0" y1="0" x2="{$documentWidth}" y2="0" class="map-border-core" stroke-dasharray="{($km div 10) - 1},1"/>
1301            <line id="border-bottom-core" x1="0" y1="{$documentHeight}" x2="{$documentWidth}" y2="{$documentHeight}" class="map-border-core" stroke-dasharray="{($km div 10) - 1},1"/>
1302            <line id="border-right-core" x1="{$documentWidth}" y1="0" x2="{$documentWidth}" y2="{$documentHeight}" class="map-border-core" stroke-dasharray="{($km div 10) - 1},1"/>
1303        </g>
1304    </xsl:template>
1305    <xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" name="gridDraw">
1306        <g id="grid" inkscape:groupmode="layer" inkscape:label="Grid">
1307            <xsl:call-template name="gridDrawHorizontals">
1308                <xsl:with-param name="line" select="&quot;1&quot;"/>
1309            </xsl:call-template>
1310            <xsl:call-template name="gridDrawVerticals">
1311                <xsl:with-param name="line" select="&quot;1&quot;"/>
1312            </xsl:call-template>
1313        </g>
1314    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" name="gridDrawHorizontals">
1315        <xsl:param name="line"/>
1316        <xsl:if test="($line*$km) &lt; $documentHeight">
1317            <line id="grid-hori-{$line}" x1="0px" y1="{$line*$km}px" x2="{$documentWidth}px" y2="{$line*$km}px" class="map-grid-line"/>
1318            <xsl:call-template name="gridDrawHorizontals">
1319                <xsl:with-param name="line" select="$line+1"/>
1320            </xsl:call-template>
1321        </xsl:if>
1322    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" name="gridDrawVerticals">
1323        <xsl:param name="line"/>
1324        <xsl:if test="($line*$km) &lt; $documentWidth">
1325            <line id="grid-vert-{$line}" x1="{$line*$km}px" y1="0px" x2="{$line*$km}px" y2="{$documentHeight}px" class="map-grid-line"/>
1326            <xsl:call-template name="gridDrawVerticals">
1327                <xsl:with-param name="line" select="$line+1"/>
1328            </xsl:call-template>
1329        </xsl:if>
1330    </xsl:template>
1331
1332    <xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" name="titleDraw">
1333        <xsl:param name="title"/>
1334
1335        <xsl:variable name="x" select="$documentWidth div 2"/>
1336        <xsl:variable name="y" select="30"/>
1337
1338        <g id="marginalia-title" inkscape:groupmode="layer" inkscape:label="Title">
1339            <rect id="marginalia-title-background" x="0px" y="0px" height="{$marginaliaTopHeight - 5}px" width="{$documentWidth}px" class="map-title-background"/>
1340            <text id="marginalia-title-text" class="map-title" x="{$x}" y="{$y}"><xsl:value-of select="$title"/></text>
1341        </g>
1342    </xsl:template>
1343    <xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" name="scaleDraw">
1344        <xsl:variable name="x1" select="14"/>
1345        <xsl:variable name="y1" select="round(($documentHeight)+((($bottomLeftLatitude)-(number($bottomLeftLatitude)))*10000*$scale*$projection))+28"/>
1346        <xsl:variable name="x2" select="$x1+$km"/>
1347        <xsl:variable name="y2" select="$y1"/>
1348
1349        <g id="marginalia-scale" inkscape:groupmode="layer" inkscape:label="Scale">
1350            <line id="marginalia-scale-casing" class="map-scale-casing" x1="{$x1}" y1="{$y1}" x2="{$x2}" y2="{$y2}"/>
1351
1352            <line id="marginalia-scale-core" class="map-scale-core" stroke-dasharray="{($km div 10)}" x1="{$x1}" y1="{$y1}" x2="{$x2}" y2="{$y2}"/>
1353
1354            <line id="marginalia-scale-bookend-from" class="map-scale-bookend" x1="{$x1}" y1="{$y1 + 2}" x2="{$x1}" y2="{$y1 - 10}"/>
1355
1356            <line id="marginalia-scale-bookend-to" class="map-scale-bookend" x1="{$x2}" y1="{$y2 + 2}" x2="{$x2}" y2="{$y2 - 10}"/>
1357
1358            <text id="marginalia-scale-text-from" class="map-scale-caption" x="{$x1}" y="{$y1 - 10}">0</text>
1359
1360            <text id="marginalia-scale-text-to" class="map-scale-caption" x="{$x2}" y="{$y2 - 10}">1km</text>
1361        </g>
1362    </xsl:template>
1363    <xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" name="metadata">
1364        <xsl:variable name="date" select="date:date()"/>
1365        <xsl:variable name="year" select="date:year()"/>
1366
1367        <xsl:comment>
1368
1369    Copyright (c) <xsl:value-of select="$year"/> OpenStreetMap
1370    www.openstreetmap.org
1371    This work is licensed under the
1372    Creative Commons Attribution-ShareAlike 2.0 License.
1373    http://creativecommons.org/licenses/by-sa/2.0/
1374
1375</xsl:comment>
1376        <metadata id="metadata">
1377            <rdf:RDF xmlns="http://web.resource.org/cc/">
1378                <cc:Work rdf:about="">
1379                    <cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/"/>
1380                    <dc:format>image/svg+xml</dc:format>
1381                    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
1382                    <dc:title><xsl:value-of select="$title"/></dc:title>
1383                    <dc:date><xsl:value-of select="substring($date,1,10)"/></dc:date>
1384                    <dc:source>http://www.openstreetmap.org/</dc:source>
1385                </cc:Work>
1386                <cc:License rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
1387                    <cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
1388                    <cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
1389                    <cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
1390                    <cc:requires rdf:resource="http://web.resource.org/cc/Notice"/>
1391                    <cc:requires rdf:resource="http://web.resource.org/cc/Attribution"/>
1392                    <cc:requires rdf:resource="http://web.resource.org/cc/ShareAlike"/>
1393                </cc:License>
1394            </rdf:RDF>
1395        </metadata>
1396    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:xlink="http://www.w3.org/1999/xlink" name="in-image-license">
1397        <xsl:param name="dx"/>
1398        <xsl:param name="dy"/>
1399
1400        <xsl:variable name="year" select="date:year()"/>
1401
1402        <g id="license" inkscape:groupmode="layer" inkscape:label="Copyright" transform="translate({$dx},{$dy})">
1403            <style type="text/css"><![CDATA[
1404                .license-text {
1405                    text-anchor: left;
1406                    font-family: "DejaVu Sans",sans-serif;
1407                    font-size: 6px;
1408                    fill: black;
1409                }
1410            ]]></style>
1411            <a id="license-cc-logo-link" xlink:href="http://creativecommons.org/licenses/by-sa/2.0/">
1412                <g id="license-cc-logo" transform="scale(0.5,0.5) translate(-604,-49)">
1413                    <path id="path3817_2_" nodetypes="ccccccc" d="M                     182.23532,75.39014 L 296.29928,75.59326 C                     297.89303,75.59326 299.31686,75.35644 299.31686,78.77344 L                     299.17721,116.34033 L 179.3569,116.34033 L                     179.3569,78.63379 C 179.3569,76.94922 179.51999,75.39014                     182.23532,75.39014 z " style="fill:#aab2ab"/>
1414                    <g id="g5908_2_" transform="matrix(0.872921,0,0,0.872921,50.12536,143.2144)">
1415                        <path id="path5906_2_" type="arc" cx="296.35416" cy="264.3577" ry="22.939548" rx="22.939548" d="M                         187.20944,-55.6792 C 187.21502,-46.99896                         180.18158,-39.95825 171.50134,-39.95212 C                         162.82113,-39.94708 155.77929,-46.97998                         155.77426,-55.66016 C 155.77426,-55.66687                         155.77426,-55.67249 155.77426,-55.6792 C                         155.76922,-64.36054 162.80209,-71.40125                         171.48233,-71.40631 C 180.16367,-71.41193                         187.20441,-64.37842 187.20944,-55.69824 C                         187.20944,-55.69263 187.20944,-55.68591                         187.20944,-55.6792 z " style="fill:white"/>
1416                        <g id="g5706_2_" transform="translate(-289.6157,99.0653)">
1417                            <path id="path5708_2_" d="M 473.88455,-167.54724 C                             477.36996,-164.06128 479.11294,-159.79333                             479.11294,-154.74451 C 479.11294,-149.69513                             477.40014,-145.47303 473.9746,-142.07715 C                             470.33929,-138.50055 466.04281,-136.71283                             461.08513,-136.71283 C 456.18736,-136.71283                             451.96526,-138.48544 448.42003,-142.03238 C                             444.87419,-145.57819 443.10158,-149.81537                             443.10158,-154.74451 C 443.10158,-159.6731                             444.87419,-163.94049 448.42003,-167.54724 C                             451.87523,-171.03375 456.09728,-172.77618                             461.08513,-172.77618 C 466.13342,-172.77618                             470.39914,-171.03375 473.88455,-167.54724 z M                             450.76657,-165.20239 C 447.81982,-162.22601                             446.34701,-158.7395 446.34701,-154.74005 C                             446.34701,-150.7417 447.80529,-147.28485                             450.72125,-144.36938 C 453.63778,-141.45288                             457.10974,-139.99462 461.1383,-139.99462 C                             465.16683,-139.99462 468.66848,-141.46743                             471.64486,-144.41363 C 474.47076,-147.14947                             475.88427,-150.59069 475.88427,-154.74005 C                             475.88427,-158.85809 474.44781,-162.35297                             471.57659,-165.22479 C 468.70595,-168.09546                             465.22671,-169.53131 461.1383,-169.53131 C                             457.04993,-169.53131 453.59192,-168.08813                             450.76657,-165.20239 z M 458.52106,-156.49927 C                             458.07074,-157.4809 457.39673,-157.9715                             456.49781,-157.9715 C 454.90867,-157.9715                             454.11439,-156.90198 454.11439,-154.763 C                             454.11439,-152.62341 454.90867,-151.55389                             456.49781,-151.55389 C 457.54719,-151.55389                             458.29676,-152.07519 458.74647,-153.11901 L                             460.94923,-151.94598 C 459.8993,-150.0805                             458.32417,-149.14697 456.22374,-149.14697 C                             454.60384,-149.14697 453.30611,-149.64367                             452.33168,-150.63653 C 451.35561,-151.62994                             450.86894,-152.99926 450.86894,-154.7445 C                             450.86894,-156.46008 451.37123,-157.82159                             452.37642,-158.83013 C 453.38161,-159.83806                             454.63347,-160.34264 456.13423,-160.34264 C                             458.35435,-160.34264 459.94407,-159.46776                             460.90504,-157.71978 L 458.52106,-156.49927 z M                             468.8844,-156.49927 C 468.43353,-157.4809                             467.77292,-157.9715 466.90201,-157.9715 C                             465.28095,-157.9715 464.46988,-156.90198                             464.46988,-154.763 C 464.46988,-152.62341                             465.28095,-151.55389 466.90201,-151.55389 C                             467.95304,-151.55389 468.68918,-152.07519                             469.10925,-153.11901 L 471.36126,-151.94598 C                             470.31301,-150.0805 468.74007,-149.14697                             466.64358,-149.14697 C 465.02587,-149.14697                             463.73095,-149.64367 462.75711,-150.63653 C                             461.78494,-151.62994 461.29773,-152.99926                             461.29773,-154.7445 C 461.29773,-156.46008                             461.79221,-157.82159 462.78061,-158.83013 C                             463.76843,-159.83806 465.02588,-160.34264                             466.55408,-160.34264 C 468.77027,-160.34264                             470.35776,-159.46776 471.3154,-157.71978 L                             468.8844,-156.49927 z "/>
1418                        </g>
1419                    </g>
1420                    <path d="M 297.29639,74.91064 L 181.06688,74.91064 C                     179.8203,74.91064 178.80614,75.92529 178.80614,77.17187 L                     178.80614,116.66748 C 178.80614,116.94922                     179.03466,117.17822 179.31639,117.17822 L                     299.04639,117.17822 C 299.32813,117.17822                     299.55713,116.94922 299.55713,116.66748 L                     299.55713,77.17188 C 299.55713,75.92529 298.54297,74.91064                     297.29639,74.91064 z M 181.06688,75.93213 L                     297.29639,75.93213 C 297.97998,75.93213 298.53565,76.48828                     298.53565,77.17188 C 298.53565,77.17188 298.53565,93.09131                     298.53565,104.59034 L 215.4619,104.59034 C                     212.41698,110.09571 206.55077,113.83399 199.81835,113.83399                     C 193.083,113.83399 187.21825,110.09913 184.1748,104.59034                     L 179.82666,104.59034 C 179.82666,93.09132                     179.82666,77.17188 179.82666,77.17188 C 179.82664,76.48828                     180.38329,75.93213 181.06688,75.93213 z " id="frame"/>
1421                    <g enable-background="new" id="g2821">
1422                        <path d="M 265.60986,112.8833 C 265.68994,113.03906                         265.79736,113.16504 265.93115,113.26172 C                         266.06494,113.35791 266.22119,113.42969                         266.40088,113.47608 C 266.58154,113.52296                         266.76807,113.54639 266.96045,113.54639 C                         267.09033,113.54639 267.22998,113.53565                         267.3794,113.51368 C 267.52784,113.4922                         267.66749,113.44972 267.79835,113.3877 C                         267.92823,113.32569 268.03761,113.23975                         268.12355,113.13086 C 268.21144,113.02197                         268.25441,112.88379 268.25441,112.71533 C                         268.25441,112.53515 268.19679,112.38916                         268.08156,112.27685 C 267.9673,112.16455                         267.81594,112.07177 267.62941,111.99658 C                         267.44386,111.92236 267.23195,111.85693                         266.9966,111.80078 C 266.76027,111.74463                         266.52101,111.68262 266.27883,111.61377 C                         266.02981,111.55176 265.78762,111.47559                         265.55129,111.38525 C 265.31594,111.29541                         265.10402,111.17822 264.9175,111.03515 C                         264.73098,110.89208 264.58059,110.71337                         264.46535,110.49853 C 264.35109,110.28369                         264.29347,110.02392 264.29347,109.71923 C                         264.29347,109.37646 264.36671,109.07958                         264.51222,108.82763 C 264.6587,108.57568                         264.85011,108.36572 265.08644,108.19726 C                         265.32179,108.02929 265.58937,107.90478                         265.8882,107.82372 C 266.18605,107.74315                         266.48488,107.70263 266.78273,107.70263 C                         267.13136,107.70263 267.46535,107.74169                         267.78566,107.81982 C 268.105,107.89746                         268.39015,108.02392 268.6382,108.19824 C                         268.88722,108.37256 269.08449,108.59521                         269.23097,108.86621 C 269.37648,109.13721                         269.44972,109.46582 269.44972,109.85156 L                         268.02784,109.85156 C 268.01514,109.65234                         267.97315,109.4873 267.90284,109.35693 C                         267.83155,109.22607 267.73682,109.12353                         267.61964,109.04834 C 267.50148,108.97412                         267.36671,108.9209 267.21534,108.89014 C                         267.063,108.85889 266.89796,108.84326                         266.71827,108.84326 C 266.60108,108.84326                         266.48292,108.85596 266.36573,108.88037 C                         266.24757,108.90576 266.14112,108.94922                         266.04542,109.01123 C 265.94874,109.07373                         265.86964,109.15137 265.80812,109.24463 C                         265.7466,109.33838 265.71535,109.45654                         265.71535,109.59961 C 265.71535,109.73047                         265.73976,109.83643 265.78957,109.91699 C                         265.83937,109.99804 265.93801,110.07275                         266.08352,110.14111 C 266.22903,110.20947                         266.43118,110.27832 266.68899,110.34668 C                         266.9468,110.41504 267.28372,110.50244                         267.70071,110.60791 C 267.82473,110.63281                         267.99661,110.67822 268.21731,110.74365 C                         268.43801,110.80908 268.65676,110.91308                         268.87454,111.05615 C 269.09231,111.1997                         269.27981,111.39111 269.43899,111.63037 C                         269.59719,111.87012 269.67629,112.17676                         269.67629,112.55029 C 269.67629,112.85547                         269.61672,113.13867 269.49856,113.3999 C                         269.3804,113.66162 269.20461,113.8872                         268.97122,114.07666 C 268.73782,114.26709                         268.44876,114.41455 268.10403,114.52051 C                         267.75833,114.62647 267.35794,114.6792                         266.90481,114.6792 C 266.53762,114.6792                         266.18118,114.63379 265.83547,114.54346 C                         265.49074,114.45313 265.18508,114.31104                         264.92043,114.11768 C 264.65676,113.92432                         264.4468,113.67774 264.29055,113.37891 C                         264.13528,113.07959 264.06106,112.7251                         264.06692,112.31397 L 265.4888,112.31397 C                         265.48877,112.53809 265.52881,112.72803                         265.60986,112.8833 z " id="path2823" style="fill:white"/>
1423                        <path d="M 273.8667,107.8667 L                         276.35986,114.53076 L 274.8374,114.53076 L                         274.33349,113.04638 L 271.84033,113.04638 L                         271.31787,114.53076 L 269.84326,114.53076 L                         272.36377,107.8667 L 273.8667,107.8667 z M                         273.95068,111.95264 L 273.11084,109.50928 L                         273.09229,109.50928 L 272.22315,111.95264 L                         273.95068,111.95264 z " id="path2825" style="fill:white"/>
1424                    </g>
1425                    <g enable-background="new" id="g2827">
1426                        <path d="M 239.17821,107.8667 C 239.49559,107.8667                         239.78563,107.89502 240.04735,107.95068 C                         240.30907,108.00683 240.53368,108.09863                         240.72118,108.22607 C 240.9077,108.35351                         241.05321,108.52295 241.15575,108.73437 C                         241.25829,108.94579 241.31005,109.20703                         241.31005,109.51806 C 241.31005,109.854                         241.23388,110.13329 241.08056,110.35742 C                         240.92822,110.58154 240.70165,110.76465                         240.40283,110.90771 C 240.81494,111.02587                         241.12256,111.23291 241.32568,111.5288 C                         241.5288,111.82469 241.63037,112.18114                         241.63037,112.59814 C 241.63037,112.93408                         241.56494,113.22509 241.43408,113.47119 C                         241.30322,113.7168 241.12646,113.91748                         240.90576,114.07324 C 240.68408,114.229                         240.43115,114.34424 240.14795,114.41845 C                         239.86377,114.49365 239.57275,114.53075                         239.27295,114.53075 L 236.03662,114.53075 L                         236.03662,107.86669 L 239.17821,107.86669 L                         239.17821,107.8667 z M 238.99071,110.56201 C                         239.25243,110.56201 239.46727,110.5 239.63622,110.37597                         C 239.80419,110.25146 239.88817,110.05029                         239.88817,109.77099 C 239.88817,109.61572                         239.85985,109.48828 239.80419,109.38915 C                         239.74755,109.28954 239.67333,109.21239                         239.57958,109.15624 C 239.48583,109.10058                         239.37841,109.06151 239.25731,109.04003 C                         239.13524,109.01806 239.00926,109.00732                         238.8784,109.00732 L 237.50535,109.00732 L                         237.50535,110.56201 L 238.99071,110.56201 z M                         239.07664,113.39014 C 239.22019,113.39014                         239.35691,113.37647 239.48777,113.34815 C                         239.61863,113.32032 239.73484,113.27344                         239.83445,113.2085 C 239.93406,113.14307                         240.01316,113.0542 240.07273,112.94239 C                         240.1323,112.83058 240.1616,112.68751                         240.1616,112.51319 C 240.1616,112.17139                         240.06492,111.92725 239.87156,111.78126 C                         239.6782,111.63527 239.42234,111.56202                         239.10496,111.56202 L 237.50535,111.56202 L                         237.50535,113.39014 L 239.07664,113.39014 z " id="path2829" style="fill:white"/>
1427                        <path d="M 241.88914,107.8667 L 243.53269,107.8667 L                         245.09324,110.49854 L 246.64402,107.8667 L                         248.27781,107.8667 L 245.80418,111.97315 L                         245.80418,114.53077 L 244.33543,114.53077 L                         244.33543,111.93604 L 241.88914,107.8667 z " id="path2831" style="fill:white"/>
1428                    </g>
1429                    <g id="g6316_1_" transform="matrix(0.624995,0,0,0.624995,391.2294,176.9332)">
1430                        <path id="path6318_1_" type="arc" cx="475.97119" cy="252.08646" ry="29.209877" rx="29.209877" d="M                         -175.0083,-139.1153 C -175.00204,-129.7035                         -182.62555,-122.06751 -192.03812,-122.06049 C                         -201.44913,-122.05341 -209.08512,-129.67774                         -209.09293,-139.09028 C -209.09293,-139.09809                         -209.09293,-139.10749 -209.09293,-139.1153 C                         -209.09919,-148.52784 -201.47413,-156.1623                         -192.06311,-156.17011 C -182.65054,-156.17713                         -175.01456,-148.55207 -175.0083,-139.14026 C                         -175.0083,-139.13092 -175.0083,-139.1239                         -175.0083,-139.1153 z " style="fill:white"/>
1431                        <g id="g6320_1_" transform="translate(-23.9521,-89.72962)">
1432                            <path id="path6322_1_" d="M -168.2204,-68.05536 C                             -173.39234,-68.05536 -177.76892,-66.25067                             -181.35175,-62.64203 C -185.02836,-58.90759                             -186.86588,-54.48883 -186.86588,-49.38568 C                             -186.86588,-44.28253 -185.02836,-39.89416                             -181.35175,-36.22308 C -177.67673,-32.55114                             -173.29859,-30.71521 -168.2204,-30.71521 C                             -163.07974,-30.71521 -158.62503,-32.56677                             -154.85312,-36.26996 C -151.30307,-39.78558                             -149.52652,-44.15827 -149.52652,-49.38568 C                             -149.52652,-54.6123 -151.33432,-59.03265                             -154.94843,-62.64203 C -158.5625,-66.25067                             -162.98599,-68.05536 -168.2204,-68.05536 z M                             -168.17352,-64.69519 C -163.936,-64.69519                             -160.33752,-63.20221 -157.37655,-60.21466 C                             -154.38748,-57.25836 -152.89214,-53.64899                             -152.89214,-49.38568 C -152.89214,-45.09186                             -154.35466,-41.52856 -157.28438,-38.69653 C                             -160.36876,-35.64727 -163.99849,-34.12304                             -168.17351,-34.12304 C -172.34856,-34.12304                             -175.94701,-35.63244 -178.96892,-38.64965 C                             -181.9908,-41.66918 -183.50176,-45.24657                             -183.50176,-49.38567 C -183.50176,-53.52398                             -181.97518,-57.13414 -178.92205,-60.21465 C                             -175.9939,-63.20221 -172.41107,-64.69519                             -168.17352,-64.69519 z "/>
1433                            <path id="path6324_1_" d="M -176.49548,-52.02087 C                             -175.75171,-56.71856 -172.44387,-59.22949                             -168.30008,-59.22949 C -162.33911,-59.22949                             -158.70783,-54.90448 -158.70783,-49.1372 C                             -158.70783,-43.50982 -162.57194,-39.13793                             -168.39383,-39.13793 C -172.39856,-39.13793                             -175.98297,-41.60277 -176.63611,-46.43877 L                             -171.93292,-46.43877 C -171.7923,-43.92778                             -170.1626,-43.04418 -167.83447,-43.04418 C                             -165.1813,-43.04418 -163.4563,-45.50908                             -163.4563,-49.27709 C -163.4563,-53.22942                             -164.94693,-55.32244 -167.74228,-55.32244 C                             -169.79074,-55.32244 -171.55948,-54.57787                             -171.93292,-52.02087 L -170.56418,-52.02789 L                             -174.26734,-48.32629 L -177.96894,-52.02789 L                             -176.49548,-52.02087 z "/>
1434                        </g>
1435                    </g>
1436                    <g id="g2838">
1437                        <circle cx="242.56226" cy="90.224609" r="10.8064" id="circle2840" style="fill:white"/>
1438                        <g id="g2842">
1439                            <path d="M 245.68994,87.09766 C 245.68994,86.68116                             245.35205,86.34424 244.93603,86.34424 L                             240.16357,86.34424 C 239.74755,86.34424                             239.40966,86.68115 239.40966,87.09766 L                             239.40966,91.87061 L 240.74071,91.87061 L                             240.74071,97.52295 L 244.3579,97.52295 L                             244.3579,91.87061 L 245.68993,91.87061 L                             245.68993,87.09766 L 245.68994,87.09766 z " id="path2844"/>
1440                            <circle cx="242.5498" cy="84.083008" r="1.63232" id="circle2846"/>
1441                        </g>
1442                        <path clip-rule="evenodd" d="M 242.53467,78.31836 C                         239.30322,78.31836 236.56641,79.4458 234.32715,81.70215                         C 232.0293,84.03516 230.88086,86.79736                         230.88086,89.98633 C 230.88086,93.1753                         232.0293,95.91846 234.32715,98.21338 C                         236.625,100.50781 239.36133,101.65527                         242.53467,101.65527 C 245.74756,101.65527                         248.53272,100.49853 250.88819,98.18359 C                         253.10889,95.98681 254.21827,93.2539 254.21827,89.98632                         C 254.21827,86.71874 253.08936,83.95751                         250.83057,81.70214 C 248.57178,79.4458                         245.80615,78.31836 242.53467,78.31836 z M                         242.56396,80.41797 C 245.2124,80.41797                         247.46142,81.35156 249.31103,83.21875 C                         251.18115,85.06592 252.11572,87.32227                         252.11572,89.98633 C 252.11572,92.66992                         251.20068,94.89746 249.36963,96.66699 C                         247.4419,98.57275 245.17334,99.52539 242.56397,99.52539                         C 239.9546,99.52539 237.70557,98.58252                         235.81739,96.6958 C 233.92774,94.80957                         232.98389,92.57324 232.98389,89.98633 C                         232.98389,87.3999 233.93799,85.14404 235.84619,83.21875                         C 237.67676,81.35156 239.9165,80.41797                         242.56396,80.41797 z " id="path2848" style="fill-rule:evenodd"/>
1443                    </g>
1444                </g>
1445            </a>
1446            <a id="license-osm-link" xlink:href="http://www.openstreetmap.org/">
1447                <g transform="translate(-210,10)" id="license-osm-text">
1448                    <text class="license-text" dx="0" dy="0">Copyright © <xsl:value-of select="$year"/> OpenStreetMap (openstreetmap.org)</text>
1449                </g>
1450            </a>
1451            <a id="license-cc-text-link" xlink:href="http://creativecommons.org/licenses/by-sa/2.0/">
1452                <g transform="translate(-150,18)" id="license-cc-text">
1453                    <text class="license-text" dx="0" dy="0">This work is licensed under the Creative</text>
1454                    <text class="license-text" dx="0" dy="8">Commons Attribution-ShareAlike 2.0 License.</text>
1455                    <text class="license-text" dx="0" dy="16">http://creativecommons.org/licenses/by-sa/2.0/</text>
1456                </g>
1457            </a>
1458        </g>
1459    </xsl:template>
1460
1461    <xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" name="zoomControl">
1462        <defs>
1463
1464            <style type="text/css">
1465              .fancyButton {
1466                stroke: #8080ff;
1467                stroke-width: 2px;
1468                fill: #fefefe;
1469                }
1470              .fancyButton:hover {
1471                stroke: red;
1472                }
1473            </style>
1474
1475            <filter id="fancyButton" filterUnits="userSpaceOnUse" x="0" y="0" width="200" height="350">
1476                <feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur"/>
1477                <feOffset in="blur" dx="2" dy="2" result="offsetBlur"/>
1478                <feSpecularLighting in="blur" surfaceScale="5" specularConstant=".75" specularExponent="20" lighting-color="white" result="specOut">
1479                    <fePointLight x="-5000" y="-10000" z="7000"/>
1480                </feSpecularLighting>
1481                <feComposite in="specOut" in2="SourceAlpha" operator="in" result="specOut"/>
1482                <feComposite in="SourceGraphic" in2="specOut" operator="arithmetic" k1="0" k2="1" k3="1" k4="0" result="litPaint"/>
1483                <feMerge>
1484                    <feMergeNode in="offsetBlur"/>
1485                    <feMergeNode in="litPaint"/>
1486                </feMerge>
1487            </filter>
1488            <symbol id="panDown" viewBox="0 0 19 19" class="fancyButton">
1489                <path d="M 17 9.5 A 7 7 0 1 1 2,9.5 A 7 7 0 1 1 17 9.5 z"/>
1490                <path d="M 9.5,5 L 9.5,14"/>
1491            </symbol>
1492            <symbol id="panUp" viewBox="0 0 19 19" class="fancyButton">
1493                <path d="M 17 9.5 A 7 7 0 1 1 2,9.5 A 7 7 0 1 1 17 9.5 z"/>
1494                <path d="M 9.5,5 L 9.5,14"/>
1495            </symbol>
1496            <symbol id="panLeft" viewBox="0 0 19 19" class="fancyButton">
1497                <path d="M 17 9.5 A 7 7 0 1 1 2,9.5 A 7 7 0 1 1 17 9.5 z"/>
1498                <path d="M 5,9.5 L 14,9.5"/>
1499            </symbol>
1500            <symbol id="panRight" viewBox="0 0 19 19" class="fancyButton">
1501                <path d="M 17 9.5 A 7 7 0 1 1 2,9.5 A 7 7 0 1 1 17 9.5 z"/>
1502                <path d="M 5,9.5 L 14,9.5"/>
1503            </symbol>
1504            <symbol id="zoomIn" viewBox="0 0 19 19" class="fancyButton">
1505                <path d="M 17 9.5 A 7 7 0 1 1 2,9.5 A 7 7 0 1 1 17 9.5 z"/>
1506                <path d="M 5,9.5 L 14,9.5 M 9.5,5 L 9.5,14"/>
1507            </symbol>
1508            <symbol id="zoomOut" viewBox="0 0 19 19" class="fancyButton">
1509                <path d="M 17 9.5 A 7 7 0 1 1 2,9.5 A 7 7 0 1 1 17 9.5 z"/>
1510                <path d="M 5,9.5 L 14,9.5"/>
1511            </symbol>
1512
1513        </defs>
1514
1515        <g id="gPanDown" filter="url(#fancyButton)" onclick="fnPan(&quot;down&quot;)">
1516            <use x="18px" y="60px" xlink:href="#panDown" width="14px" height="14px"/>
1517        </g>
1518        <g id="gPanRight" filter="url(#fancyButton)" onclick="fnPan(&quot;right&quot;)">
1519            <use x="8px" y="70px" xlink:href="#panRight" width="14px" height="14px"/>
1520        </g>
1521        <g id="gPanLeft" filter="url(#fancyButton)" onclick="fnPan(&quot;left&quot;)">
1522            <use x="28px" y="70px" xlink:href="#panLeft" width="14px" height="14px"/>
1523        </g>
1524        <g id="gPanUp" filter="url(#fancyButton)" onclick="fnPan(&quot;up&quot;)">
1525            <use x="18px" y="80px" xlink:href="#panUp" width="14px" height="14px"/>
1526        </g>
1527
1528        <xsl:variable name="x1" select="25"/>
1529        <xsl:variable name="y1" select="105"/>
1530        <xsl:variable name="x2" select="25"/>
1531        <xsl:variable name="y2" select="300"/>
1532
1533        <line style="stroke-width: 10; stroke-linecap: butt; stroke: #8080ff;">
1534            <xsl:attribute name="x1"><xsl:value-of select="$x1"/></xsl:attribute>
1535            <xsl:attribute name="y1"><xsl:value-of select="$y1"/></xsl:attribute>
1536            <xsl:attribute name="x2"><xsl:value-of select="$x2"/></xsl:attribute>
1537            <xsl:attribute name="y2"><xsl:value-of select="$y2"/></xsl:attribute>
1538        </line>
1539
1540        <line style="stroke-width: 8; stroke-linecap: butt; stroke: white; stroke-dasharray: 10,1;">
1541            <xsl:attribute name="x1"><xsl:value-of select="$x1"/></xsl:attribute>
1542            <xsl:attribute name="y1"><xsl:value-of select="$y1"/></xsl:attribute>
1543            <xsl:attribute name="x2"><xsl:value-of select="$x2"/></xsl:attribute>
1544            <xsl:attribute name="y2"><xsl:value-of select="$y2"/></xsl:attribute>
1545        </line>
1546
1547        <!-- Need to use onmousedown because onclick is interfered with by the onmousedown handler for panning -->
1548        <g id="gZoomIn" filter="url(#fancyButton)" onmousedown="fnZoom(&quot;in&quot;)">
1549            <use x="15.5px" y="100px" xlink:href="#zoomIn" width="19px" height="19px"/>
1550        </g>
1551
1552        <!-- Need to use onmousedown because onclick is interfered with by the onmousedown handler for panning -->
1553        <g id="gZoomOut" filter="url(#fancyButton)" onmousedown="fnZoom(&quot;out&quot;)">
1554            <use x="15.5px" y="288px" xlink:href="#zoomOut" width="19px" height="19px"/>
1555        </g>
1556    </xsl:template><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:xi="http://www.w3.org/2001/XInclude" name="javaScript">
1557        <script>
1558            /*
1559
1560Osmarender
1561
1562interactive.js
1563
1564*/
1565
1566function fnResize() {
1567    fnResizeElement("gAttribution")
1568    fnResizeElement("gLicense")
1569    fnResizeElement("gZoomIn")
1570    fnResizeElement("gZoomOut")
1571}
1572
1573
1574function fnResizeElement(e) {
1575    //
1576    var oSVG,scale,currentTranslateX,currentTranslateY,oe
1577    //
1578    oSVG=document.rootElement
1579    scale=1/oSVG.currentScale
1580    currentTranslateX=oSVG.currentTranslate.x
1581    currentTranslateY=oSVG.currentTranslate.y
1582    oe=document.getElementById(e)
1583    if (oe) oe.setAttributeNS(null,"transform","scale("+scale+","+scale+") translate("+(-currentTranslateX)+","+(-currentTranslateY)+")")
1584}
1585
1586
1587function fnToggleImage(osmImage) {
1588    var xlink = 'http://www.w3.org/1999/xlink';
1589    ogThumbnail=document.getElementById('gThumbnail')
1590    if (ogThumbnail.getAttributeNS(null,"visibility")=="visible") fnHideImage()
1591    else {
1592        ogThumbnail.setAttributeNS(null,"visibility","visible")
1593        oThumbnail=document.getElementById('thumbnail')
1594        oThumbnail.setAttributeNS(xlink,"href",osmImage)
1595    }
1596}
1597
1598function fnHideImage() {
1599    ogThumbnail=document.getElementById('gThumbnail')
1600    ogThumbnail.setAttributeNS(null,"visibility","hidden")
1601}
1602
1603
1604/* The following code originally written by Jonathan Watt (http://jwatt.org/), Aug. 2005 */
1605
1606if (!window)
1607window = this;
1608
1609
1610function fnOnLoad(evt) {
1611    if (!document) window.document = evt.target.ownerDocument
1612}
1613
1614
1615/**
1616  * Event handlers to change the current user space for the zoom and pan
1617  * controls to make them appear to be scale invariant.
1618  */
1619
1620function fnOnZoom(evt) {
1621    try {
1622        if (evt.newScale === undefined) throw 'bad interface'
1623        // update the transform list that adjusts for zoom and pan
1624        var tlist = document.getElementById('staticElements').transform.baseVal
1625        tlist.getItem(0).setScale(1/evt.newScale, 1/evt.newScale)
1626        tlist.getItem(1).setTranslate(-evt.newTranslate.x, -evt.newTranslate.y)
1627        }
1628    catch (e) {
1629        // work around difficiencies in non-moz implementations (some don't
1630        // implement the SVGZoomEvent or SVGAnimatedTransform interfaces)
1631        var de = document.documentElement
1632        var tform = 'scale(' + 1/de.currentScale + ') ' + 'translate(' + (-de.currentTranslate.x) + ', ' + (-de.currentTranslate.y) + ')'
1633        document.getElementById('staticElements').setAttributeNS(null, 'transform', tform)
1634        }
1635    }
1636
1637
1638function fnOnScroll(evt) {
1639    var ct = document.documentElement.currentTranslate
1640    try {
1641        // update the transform list that adjusts for zoom and pan
1642        var tlist = document.getElementById('staticElements').transform.baseVal
1643        tlist.getItem(1).setTranslate(-ct.x, -ct.y)
1644        }
1645    catch (e) {
1646        // work around difficiencies in non-moz implementations (some don't
1647        // implement the SVGAnimatedTransform interface)
1648        var tform = 'scale(' + 1/document.documentElement.currentScale + ') ' + 'translate(' + (-ct.x) + ', ' + (-ct.y) + ')';
1649        document.getElementById('staticElements').setAttributeNS(null, 'transform', tform)
1650        }
1651    }
1652
1653
1654function fnZoom(type) {
1655    var de = document.documentElement;
1656    var oldScale = de.currentScale;
1657    var oldTranslate = { x: de.currentTranslate.x, y: de.currentTranslate.y };
1658    var s = 2;
1659    if (type == 'in') {de.currentScale *= 1.5;}
1660    if (type == 'out') {de.currentScale /= 1.4;}
1661    // correct currentTranslate so zooming is to the center of the viewport:
1662
1663    var vp_width, vp_height;
1664    try {
1665        vp_width = de.viewport.width;
1666        vp_height = de.viewport.height;
1667    }
1668    catch (e) {
1669        // work around difficiency in moz ('viewport' property not implemented)
1670        vp_width = window.innerWidth;
1671        vp_height = window.innerHeight;
1672    }
1673    de.currentTranslate.x = vp_width/2 - ((de.currentScale/oldScale) * (vp_width/2 - oldTranslate.x));
1674    de.currentTranslate.y = vp_height/2 - ((de.currentScale/oldScale) * (vp_height/2 - oldTranslate.y));
1675
1676}
1677
1678
1679function fnPan(type) {
1680    var de = document.documentElement;
1681    var ct = de.currentTranslate;
1682    var t = 150;
1683    if (type == 'right') ct.x += t;
1684    if (type == 'down') ct.y += t;
1685    if (type == 'left') ct.x -= t;
1686    if (type == 'up') ct.y -= t;
1687}
1688
1689
1690var gCurrentX,gCurrentY
1691var gDeltaX,gDeltaY
1692var gMouseDown=false
1693var gCurrentTranslate=document.documentElement.currentTranslate
1694
1695function fnOnMouseDown(evt) {
1696    gCurrentX=gCurrentTranslate.x
1697    gCurrentY=gCurrentTranslate.y
1698    gDeltaX=evt.clientX
1699    gDeltaY=evt.clientY
1700    gMouseDown=true
1701    evt.target.ownerDocument.rootElement.setAttributeNS(null,"cursor","move")
1702}
1703
1704
1705function fnOnMouseUp(evt) {
1706    gMouseDown=false
1707    evt.target.ownerDocument.rootElement.setAttribute("cursor","default")
1708}
1709
1710
1711function fnOnMouseMove(evt) {
1712    var id
1713    if (gMouseDown) {
1714        gCurrentTranslate.x=gCurrentX+evt.clientX-gDeltaX
1715        gCurrentTranslate.y=gCurrentY+evt.clientY-gDeltaY
1716    }
1717}
1718
1719
1720        </script>
1721    </xsl:template>
1722
1723</xsl:stylesheet>
Note: See TracBrowser for help on using the repository browser.