source: subversion/applications/utils/map-feature-ref/mapfeatures-1n-tab-sec-fo.xsl @ 34651

Last change on this file since 34651 was 15895, checked in by sward, 10 years ago

Some XSL stylesheets to generate references for Map Features.

File size: 6.8 KB
Line 
1<?xml version="1.0"?>
2<xsl:stylesheet version="1.0"
3  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4  xmlns:fo="http://www.w3.org/1999/XSL/Format">
5
6  <xsl:output method="xml" version="1.0" indent="yes"/>
7
8  <xsl:param name="document-title">OpenStreetMap: Map Features</xsl:param>
9  <!-- A4 paper -->
10  <xsl:param name="page-width">210mm</xsl:param>
11  <xsl:param name="page-height">297mm</xsl:param>
12  <!-- Letter paper -->
13  <!--
14  <xsl:param name="page-width">8.5in</xsl:param>
15  <xsl:param name="page-height">11in</xsl:param>
16  -->
17
18  <!-- Meunchian method is used to group by key name.  -->
19  <xsl:key name="features-by-key" match="feature" use="concat(../@name, '::', @key)"/>
20
21  <!--
22  For now access restrictions for transport modes are hard‐coded here.
23  Keys in this list reference the ‘access’ key for possible values.
24  -->
25  <xsl:key name="access-restrictions" match="feature[../@name = 'Map_Features:restrictions'
26    and (@key = 'bicycle'
27    or @key = 'foot'
28    or @key = 'goods'
29    or @key = 'hgv'
30    or @key = 'agricultural'
31    or @key = 'horse'
32    or @key = 'motorcycle'
33    or @key = 'motorcar'
34    or @key = 'psv'
35    or @key = 'motorboat'
36    or @key = 'boat')]"
37    use="concat(../@name, '::', @key)"/>
38
39  <!-- Define the page layout at the document root. -->
40  <xsl:template match="mapfeatures">
41    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
42      <fo:layout-master-set>
43        <fo:simple-page-master master-name="main" margin="12mm"
44          page-width="{$page-width}" page-height="{$page-height}"
45          reference-orientation="90">
46          <fo:region-body column-count="4" column-gap="5mm"/>
47          <fo:region-after/>
48        </fo:simple-page-master>
49      </fo:layout-master-set>
50      <fo:page-sequence master-reference="main">
51        <fo:flow flow-name="xsl-region-body" font-size="8pt" line-height="10pt">
52          <xsl:call-template name="title-heading">
53            <xsl:with-param name="text" select="$document-title"/>
54          </xsl:call-template>
55          <xsl:apply-templates/>
56          <fo:block font-size="6pt" line-height="8pt">
57            Generated from OpenStreetMap Map Features.
58            Available under the Creative Commons Attribution-ShareAlike 2.0 licence.
59          </fo:block>
60        </fo:flow>
61      </fo:page-sequence>
62    </fo:root>
63  </xsl:template>
64
65  <xsl:template match="section">
66    <xsl:call-template name="section-heading">
67      <xsl:with-param name="text" select="substring-after(@name, 'Map_Features:')"/>
68    </xsl:call-template>
69    <fo:table table-layout="fixed" width="64mm"
70      border-top-style="solid" border-bottom-style="solid"
71      space-after="6pt">
72      <fo:table-column column-width="22mm"/>
73      <fo:table-column column-width="42mm"/>
74      <fo:table-body>
75        <xsl:apply-templates select="feature[generate-id() = generate-id(key('features-by-key', concat(../@name, '::', @key)))]"/>
76      </fo:table-body>
77    </fo:table>
78  </xsl:template>
79
80  <xsl:template match="feature">
81    <xsl:variable name="currentvalues" select="key('features-by-key', concat(../@name, '::', @key))/value"/>
82    <xsl:choose>
83      <xsl:when test="key('access-restrictions', concat(../@name, '::', @key))">
84        <fo:table-row>
85          <xsl:if test="position() != 1">
86            <xsl:attribute name="border-top-style">dotted</xsl:attribute>
87          </xsl:if>
88          <fo:table-cell>
89            <xsl:apply-templates select="@key"/>
90          </fo:table-cell>
91          <fo:table-cell>
92            <fo:block>
93              <xsl:attribute name="font-style">italic</xsl:attribute>
94              <xsl:text>See: </xsl:text>
95              <fo:inline font-weight="bold">access</fo:inline>
96            </fo:block>
97          </fo:table-cell>
98        </fo:table-row>
99      </xsl:when>
100      <xsl:otherwise>
101        <!-- Not an access restriction -->
102        <fo:table-row>
103          <xsl:if test="position() != 1">
104            <xsl:attribute name="border-top-style">dotted</xsl:attribute>
105          </xsl:if>
106          <fo:table-cell>
107            <xsl:if test="count($currentvalues[@name != 'User defined' and @name != 'Other Values']) &gt; 1">
108              <xsl:attribute name="number-rows-spanned">
109                <xsl:value-of select="count($currentvalues[@name != 'User defined' and @name != 'Other Values'])"/>
110              </xsl:attribute>
111            </xsl:if>
112            <xsl:apply-templates select="@key"/>
113          </fo:table-cell>
114          <fo:table-cell>
115            <fo:block>
116              <xsl:call-template name="value">
117                <xsl:with-param name="name" select="$currentvalues[1]/@name"/>
118              </xsl:call-template>
119            </fo:block>
120          </fo:table-cell>
121        </fo:table-row>
122        <xsl:apply-templates select="$currentvalues"/>
123      </xsl:otherwise>
124    </xsl:choose>
125    </xsl:template>
126
127  <xsl:template match="@key">
128    <fo:block font-weight="bold">
129      <xsl:value-of select="."/>
130    </fo:block>
131  </xsl:template>
132
133  <xsl:template match="value">
134    <xsl:if test="position() != 1">
135      <fo:table-row>
136        <xsl:attribute name="keep-with-previous">
137          <xsl:choose>
138            <xsl:when test="position() = last()">10</xsl:when>
139            <xsl:otherwise>5</xsl:otherwise>
140          </xsl:choose>
141        </xsl:attribute>
142        <fo:table-cell>
143          <fo:block>
144            <xsl:call-template name="value">
145              <xsl:with-param name="name" select="@name"/>
146            </xsl:call-template>
147          </fo:block>
148        </fo:table-cell>
149      </fo:table-row>
150    </xsl:if>
151  </xsl:template>
152
153  <xsl:template name="title-heading">
154    <xsl:param name="text"/>
155    <fo:block font-size="11pt" font-weight="bold" line-height="14pt"
156      space-after="4pt" text-align="center">
157      <xsl:value-of select="$text"/>
158    </fo:block>
159  </xsl:template>
160
161  <xsl:template name="section-heading">
162    <xsl:param name="text"/>
163    <fo:block font-size="9pt" font-weight="bold" line-height="12pt" keep-with-next="20">
164      <xsl:value-of select="$text"/>
165    </fo:block>
166  </xsl:template>
167
168  <xsl:template name="value">
169    <xsl:param name="name"/>
170    <xsl:variable name="weekdays">monday, mon, tuesday, tue, wednesday, wed, thursday, thu, friday, fri, saturday, sat, sunday, sun</xsl:variable>
171    <xsl:if test="($name = 'User defined')
172      or ($name = 'Date')
173      or ($name = 'URI')
174      or ($name = 'Numeric value')
175      or ($name = 'Other Values')
176      or starts-with($name, 'List:')
177      or starts-with($name, 'Range:')">
178      <xsl:attribute name="font-style">italic</xsl:attribute>
179    </xsl:if>
180    <xsl:choose>
181      <xsl:when test="starts-with($name, 'List:')
182        and normalize-space(substring-after($name, 'List: ')) = normalize-space($weekdays)">
183        <xsl:text>List: day of week (e.g. monday, mon)</xsl:text>
184      </xsl:when>
185      <xsl:otherwise>
186        <xsl:value-of select="$name"/>
187      </xsl:otherwise>
188    </xsl:choose>
189  </xsl:template>
190
191</xsl:stylesheet>
Note: See TracBrowser for help on using the repository browser.