source: subversion/applications/utils/export/osmgarminmap/osm2mpx.xsl @ 28719

Last change on this file since 28719 was 4489, checked in by jochen, 12 years ago

Removed some segment stuff in preparation for API 0.5 changes
Documentation updates

File size: 13.3 KB
Line 
1<?xml version='1.0' encoding='iso-8859-1' ?>
2<xsl:stylesheet 
3    version="1.0"
4    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
5 
6<!--
7
8Copyright (C) 2006  Jochen Topf <jochen@remote.org>
9
10This program is free software; you can redistribute it and/or modify
11it under the terms of the GNU General Public License as published by
12the Free Software Foundation; either version 2 of the License, or
13(at your option) any later version.
14
15This program is distributed in the hope that it will be useful,
16but WITHOUT ANY WARRANTY; without even the implied warranty of
17MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18GNU General Public License for more details.
19
20You should have received a copy of the GNU General Public License
21along with this program; if not, write to the Free Software
22Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
23
24-->
25        <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
26
27    <xsl:param name="mapid" select="rules/@mapid"/>
28    <xsl:param name="name" select="rules/@name"/>
29
30        <xsl:key name='nodeById' match='/osm/node' use='@id'/>
31        <xsl:key name='segmentById' match='/osm/segment' use='@id'/>
32        <xsl:key name='segmentByFromNode' match='/osm/segment' use='@from'/>
33        <xsl:key name='segmentByToNode' match='/osm/segment' use='@to'/>
34        <xsl:key name='wayBySegment' match='/osm/way' use='seg/@id'/>
35       
36        <xsl:variable name='data' select='document(/rules/@data)'/>
37
38    <xsl:template match="/">
39        <map mapid="{$mapid}" name="{$name}" levels="{rules/@levels}">
40            <xsl:apply-templates select="/rules/rule">
41                <xsl:with-param name='elements' select='$data/osm/*' />
42            </xsl:apply-templates>
43        </map>
44    </xsl:template>
45
46    <xsl:template match="rule">
47                <xsl:param name='elements'/>
48
49                <!-- This is the rule currently being processed -->
50                <xsl:variable name='rule' select='.'/>
51
52                <!-- Make list of elements that this rule should be applied to -->
53                <xsl:variable name='eBare'>
54                        <xsl:choose>
55                                <xsl:when test='$rule/@e="*"'>node|way</xsl:when>
56                                <xsl:when test='$rule/@e'><xsl:value-of select='$rule/@e'/></xsl:when>
57                                <xsl:otherwise>node|way</xsl:otherwise>
58                        </xsl:choose>
59                </xsl:variable>
60
61                <!-- List of keys that this rule should be applied to -->
62                <xsl:variable name='kBare' select='$rule/@k' />
63
64                <!-- List of values that this rule should be applied to -->
65                <xsl:variable name='vBare' select='$rule/@v' />
66
67                <!-- Top'n'tail selectors with | for contains usage -->
68                <xsl:variable name='e'>|<xsl:value-of select='$eBare'/>|</xsl:variable>
69                <xsl:variable name='k'>|<xsl:value-of select='$kBare'/>|</xsl:variable>
70                <xsl:variable name='v'>|<xsl:value-of select='$vBare'/>|</xsl:variable>
71
72
73                <xsl:variable name='selectedElements' select='$elements[contains($e,concat("|",name(),"|"))or (contains($e,"|waysegment|") and name()="segment" and key("wayBySegment",@id))]'/>
74
75                <xsl:choose>
76                        <xsl:when test='contains($k,"|*|")'>
77                                <xsl:choose>
78                                        <xsl:when test='contains($v,"|~|")'>
79                                                <xsl:variable name='elementsWithNoTags' select='$selectedElements[count(tag)=0]'/>
80                                                <xsl:call-template name='processElements'>
81                                                        <xsl:with-param name='eBare' select='$eBare'/>
82                                                        <xsl:with-param name='kBare' select='$kBare'/>
83                                                        <xsl:with-param name='vBare' select='$vBare'/>
84                                                        <xsl:with-param name='elements' select='$elementsWithNoTags'/>
85                                                        <xsl:with-param name='rule' select='$rule'/>
86                                                </xsl:call-template>
87                                        </xsl:when>
88                                        <xsl:when test='contains($v,"|*|")'>
89                                                <xsl:variable name='allElements' select='$selectedElements'/>
90                                                <xsl:call-template name='processElements'>
91                                                        <xsl:with-param name='eBare' select='$eBare'/>
92                                                        <xsl:with-param name='kBare' select='$kBare'/>
93                                                        <xsl:with-param name='vBare' select='$vBare'/>
94                                                        <xsl:with-param name='elements' select='$allElements'/>
95                                                        <xsl:with-param name='rule' select='$rule'/>
96                                                </xsl:call-template>
97                                        </xsl:when>
98                                        <xsl:otherwise>
99                                                <xsl:variable name='allElementsWithValue' select='$selectedElements[tag[contains($v,concat("|",@v,"|"))]]'/>
100                                                <xsl:call-template name='processElements'>
101                                                        <xsl:with-param name='eBare' select='$eBare'/>
102                                                        <xsl:with-param name='kBare' select='$kBare'/>
103                                                        <xsl:with-param name='vBare' select='$vBare'/>
104                                                        <xsl:with-param name='elements' select='$allElementsWithValue'/>
105                                                        <xsl:with-param name='rule' select='$rule'/>
106                                                </xsl:call-template>
107                                        </xsl:otherwise>
108                                </xsl:choose>
109                        </xsl:when>
110                        <xsl:when test='contains($v,"|~|")'>
111                                <xsl:variable name='elementsWithoutKey' select='$selectedElements[count(tag[contains($k,concat("|",@k,"|"))])=0]'/>
112                                <xsl:call-template name='processElements'>
113                                        <xsl:with-param name='eBare' select='$eBare'/>
114                                        <xsl:with-param name='kBare' select='$kBare'/>
115                                        <xsl:with-param name='vBare' select='$vBare'/>
116                                        <xsl:with-param name='elements' select='$elementsWithoutKey'/>
117                                        <xsl:with-param name='rule' select='$rule'/>
118                                </xsl:call-template>
119                        </xsl:when>
120                        <xsl:when test='contains($v,"|*|")'>
121                                <xsl:variable name='allElementsWithKey' select='$selectedElements[tag[contains($k,concat("|",@k,"|"))]]'/>
122                                <xsl:call-template name='processElements'>
123                                        <xsl:with-param name='eBare' select='$eBare'/>
124                                        <xsl:with-param name='kBare' select='$kBare'/>
125                                        <xsl:with-param name='vBare' select='$vBare'/>
126                                        <xsl:with-param name='elements' select='$allElementsWithKey'/>
127                                        <xsl:with-param name='rule' select='$rule'/>
128                                </xsl:call-template>
129                        </xsl:when>
130                        <xsl:otherwise>
131                                <xsl:variable name='elementsWithKey' select='$selectedElements[tag[contains($k,concat("|",@k,"|")) and contains($v,concat("|",@v,"|"))]]'/>
132                                <xsl:call-template name='processElements'>
133                                        <xsl:with-param name='eBare' select='$eBare'/>
134                                        <xsl:with-param name='kBare' select='$kBare'/>
135                                        <xsl:with-param name='vBare' select='$vBare'/>
136                                        <xsl:with-param name='elements' select='$elementsWithKey'/>
137                                        <xsl:with-param name='rule' select='$rule'/>
138                                </xsl:call-template>
139                        </xsl:otherwise>
140                </xsl:choose>
141    </xsl:template>
142
143        <!-- Process a set of elements selected by a rule  -->
144        <xsl:template name='processElements'>
145                <xsl:param name='eBare'/>
146                <xsl:param name='kBare'/>
147                <xsl:param name='vBare'/>
148                <xsl:param name='elements'/>
149                <xsl:param name='rule'/>
150               
151                <xsl:if test='$elements'>
152                        <xsl:message>
153Processing &lt;rule e="<xsl:value-of select='$eBare'/>" k="<xsl:value-of select='$kBare'/>" v="<xsl:value-of select='$vBare'/>" &gt; 
154Matched by <xsl:value-of select='count($elements)'/> elements.
155                        </xsl:message>
156
157                        <xsl:apply-templates select='*'>
158                                <xsl:with-param name='elements' select='$elements' />
159                                <xsl:with-param name='rule' select='$rule'/>
160                        </xsl:apply-templates>
161                </xsl:if>
162        </xsl:template>
163
164    <xsl:template match="point|city">
165                <xsl:param name='elements'/>
166                <xsl:param name='rule'/>
167
168                <!-- This is the instruction that is currently being processed -->
169                <xsl:variable name='instruction' select='.'/>
170
171        <!-- For each point or city -->
172        <xsl:apply-templates select='$elements' mode='point'>
173            <xsl:with-param name='instruction' select='$instruction' />
174        </xsl:apply-templates>
175        </xsl:template>
176
177    <xsl:template match="polyline|polygon">
178                <xsl:param name='elements'/>
179                <xsl:param name='rule'/>
180
181                <!-- This is the instruction that is currently being processed -->
182                <xsl:variable name='instruction' select='.'/>
183
184        <!-- For each segment and way -->
185        <xsl:apply-templates select='$elements' mode='line'>
186            <xsl:with-param name='instruction' select='$instruction' />
187        </xsl:apply-templates>
188        </xsl:template>
189
190        <!-- Suppress output of any unhandled elements -->
191        <xsl:template match='*' mode='line'/>
192        <xsl:template match='*' mode='point'/>
193
194        <!-- Draw points -->
195    <xsl:template match="node" mode="point">
196                <xsl:param name='instruction' />
197
198<!--            <xsl:call-template name='drawLine'>
199                        <xsl:with-param name='instruction' select='$instruction'/>
200                        <xsl:with-param name='segment' select='.'/>
201                </xsl:call-template>-->
202   
203        <xsl:element name="{name($instruction)}">
204            <xsl:attribute name="type">
205                <xsl:value-of select="$instruction/@type"/>
206            </xsl:attribute>
207            <xsl:attribute name="subtype">
208                <xsl:value-of select="$instruction/@subtype"/>
209            </xsl:attribute>
210            <xsl:attribute name="id">
211                <xsl:value-of select="@id"/>
212            </xsl:attribute>
213            <xsl:attribute name="endlevel">
214                <xsl:choose>
215                    <xsl:when test="$instruction/@endlevel">
216                        <xsl:value-of select="$instruction/@endlevel"/>
217                    </xsl:when>
218                    <xsl:otherwise>
219                        <xsl:text>3</xsl:text>
220                    </xsl:otherwise>
221                </xsl:choose>
222             </xsl:attribute>
223            <xsl:if test="tag[(@k='name')and(@v!='')]">
224                <label><xsl:value-of select="tag[@k='name']/@v"/></label>
225            </xsl:if>
226            <data level="0" latlon="{@lat},{@lon}"/>
227        </xsl:element>
228        </xsl:template>
229
230        <!-- Draw lines for a segment -->
231    <xsl:template match="segment" mode="line">
232                <xsl:param name='instruction' />
233
234                <xsl:call-template name='drawLine'>
235                        <xsl:with-param name='instruction' select='$instruction'/>
236                        <xsl:with-param name='segment' select='.'/>
237                </xsl:call-template>
238        </xsl:template>
239
240        <!-- Draw lines for a way (draw all the segments that belong to the way) -->
241        <xsl:template match='way' mode='line'>
242                <xsl:param name='instruction' />
243
244                <!-- The current <way> element -->
245                <xsl:variable name='way' select='.' />
246               
247                <xsl:call-template name='drawWay'>
248                        <xsl:with-param name='instruction' select='$instruction'/>
249                        <xsl:with-param name='way' select='$way'/>
250                </xsl:call-template>
251        </xsl:template>
252       
253        <!-- ============================================================================= -->
254        <!-- Drawing templates                                                             -->
255        <!-- ============================================================================= -->
256
257        <!-- Draw a line for the current <segment> element using the formatting of the current <line> instruction -->
258        <xsl:template name='drawLine'>
259                <xsl:param name='instruction'/>
260                <xsl:param name='segment'/> <!-- The current segment element -->
261                <xsl:param name='way'/>  <!-- The current way element if applicable -->
262
263                <xsl:variable name='from' select='@from'/>
264                <xsl:variable name='to' select='@to'/>
265                <xsl:variable name='fromNode' select='key("nodeById",$from)'/>
266                <xsl:variable name='toNode' select='key("nodeById",$to)'/>
267
268        <xsl:element name="{name($instruction)}">
269            <xsl:attribute name="type">
270                <xsl:value-of select="$instruction/@type"/>
271            </xsl:attribute>
272            <data level="0">
273                <segment from="{$fromNode/@lat},{$fromNode/@lon}" to="{$toNode/@lat},{$toNode/@lon}"/>
274            </data>
275        </xsl:element>
276        </xsl:template>
277
278        <!-- Draw a line for the current <way> element using the formatting of the current <line> instruction -->       
279        <xsl:template name='drawWay'>
280                <xsl:param name='instruction'/>
281                <xsl:param name='way'/>  <!-- The current way element if applicable -->
282
283        <xsl:element name="{name($instruction)}">
284            <xsl:attribute name="type">
285                <xsl:value-of select="$instruction/@type"/>
286            </xsl:attribute>
287            <xsl:attribute name="endlevel">
288                <xsl:choose>
289                    <xsl:when test="$instruction/@endlevel">
290                        <xsl:value-of select="$instruction/@endlevel"/>
291                    </xsl:when>
292                    <xsl:otherwise>
293                        <xsl:text>3</xsl:text>
294                    </xsl:otherwise>
295                </xsl:choose>
296            </xsl:attribute>
297            <xsl:attribute name="id">
298                <xsl:value-of select="$way/@id"/>
299            </xsl:attribute>
300            <xsl:choose>
301                <xsl:when test="($way/tag[(@k='name')and(@v!='')])and($way/tag[(@k='ref')and(@v!='')])">
302                    <label>
303                        <xsl:value-of select="$way/tag[@k='ref']/@v"/>
304                        <xsl:text> </xsl:text>
305                        <xsl:value-of select="$way/tag[@k='name']/@v"/>
306                    </label>
307                </xsl:when>
308                <xsl:when test="$way/tag[(@k='name')and(@v!='')]">
309                    <label><xsl:value-of select="$way/tag[@k='name']/@v"/></label>
310                </xsl:when>
311                <xsl:when test="$way/tag[(@k='ref')and(@v!='')]">
312                    <label><xsl:value-of select="$way/tag[@k='ref']/@v"/></label>
313                </xsl:when>
314            </xsl:choose>
315            <data level="0">
316                <xsl:for-each select="$way/seg">
317                    <xsl:variable name="segment" select='key("segmentById", @id)'/>
318                    <xsl:variable name='from' select='$segment/@from'/>
319                    <xsl:variable name='to' select='$segment/@to'/>
320                    <xsl:variable name='fromNode' select='key("nodeById",$from)'/>
321                    <xsl:variable name='toNode' select='key("nodeById",$to)'/>
322                    <xsl:if test="$fromNode/@lat!=''">
323                        <segment from="{$fromNode/@lat},{$fromNode/@lon}" to="{$toNode/@lat},{$toNode/@lon}"/>
324                    </xsl:if>
325                </xsl:for-each>
326            </data>
327        </xsl:element>
328
329        </xsl:template>
330
331</xsl:stylesheet>
Note: See TracBrowser for help on using the repository browser.