postgis/doc/xsl/postgis_cheatsheet.html.xsl
2015-05-13 18:13:18 +00:00

282 lines
11 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- ********************************************************************
********************************************************************
Copyright 2011, Regina Obe
License: BSD
Purpose: This is an xsl transform that generates PostgreSQL COMMENT ON FUNCTION ddl
statements from postgis xml doc reference
******************************************************************** -->
<xsl:output method="text" />
<xsl:variable name='postgis_version'>2.1</xsl:variable>
<xsl:variable name='new_tag'>Availability: <xsl:value-of select="$postgis_version" /></xsl:variable>
<xsl:variable name='enhanced_tag'>Enhanced: <xsl:value-of select="$postgis_version" /></xsl:variable>
<xsl:variable name='include_examples'>false</xsl:variable>
<xsl:variable name='output_purpose'>true</xsl:variable>
<xsl:variable name='linkstub'>http://postgis.net/docs/manual-dev/</xsl:variable>
<xsl:template match="/">
<xsl:text><![CDATA[<html><head><title>PostGIS Cheat Sheet</title>
<style type="text/css">
<!--
table { page-break-inside:avoid; page-break-after:auto }
tr { page-break-inside:avoid; page-break-after:avoid }
thead { display:table-header-group }
tfoot { display:table-footer-group }
body {
font-family: Arial, sans-serif;
font-size: 8.5pt;
}
@media print { a , a:hover, a:focus, a:active{text-decoration: none;color:black} }
@media screen { a , a:hover, a:focus, a:active{text-decoration: underline} }
.comment {font-size:x-small;color:green;font-family:"courier new"}
.notes {font-size:x-small;color:#dd1111;font-weight:500;font-family:verdana}
#example_heading {
border-bottom: 1px solid #000;
margin: 10px 15px 10px 85px;
color: #4a124a;font-size: 7.5pt;
}
#content_functions {
width:100%;
float: left;
}
#content_functions_left {
width:52%;
float: left;
}
#content_functions_right {
width: 45%;
float: right;
}
#content_examples {
float: left;
width: 100%;
}
.section {
border: 1px solid #000;
margin: 4px;
]]></xsl:text>
<xsl:choose><xsl:when test="$output_purpose = 'false'"><![CDATA[width: 100%]]></xsl:when><xsl:otherwise><![CDATA[width: 100%;]]></xsl:otherwise></xsl:choose>
<xsl:text><![CDATA[
float: left;
}
.example {
border: 1px solid #000;
margin: 4px;
width: 50%;
float:left;
}
.example b {font-size: 7.5pt}
.example th {
border: 1px solid #000;
color: #000;
background-color: #ddd;
font-size: 8.0pt;
}
.section th {
border: 1px solid #000;
color: #fff;
background-color: #FF9900;
font-size: 9.5pt;
}
.section td {
font-family: Arial, sans-serif;
font-size: 8.5pt;
vertical-align: top;
border: 0;
}
.func {font-weight: 600}
.func {font-weight: 600}
.func_args {font-size: 8pt;font-family:"courier new";float:left}
.evenrow {
background-color: #eee;
}
.oddrow {
background-color: #fff;
}
h1 {
margin: 0px;
padding: 0px;
font-size: 14pt;
}
code {font-size: 8pt}
-->
</style>
</head><body><h1 style='text-align:center'>PostGIS ]]></xsl:text> <xsl:value-of select="$postgis_version" /><xsl:text><![CDATA[ Cheatsheet</h1>]]></xsl:text>
<xsl:text><![CDATA[<span class='notes'>New in this release <sup>1</sup> Enhanced in this release <sup>2</sup> Requires GEOS 3.4 or higher<sup>g3.4</sup> &nbsp;2.5/3D support<sup>3d</sup>&nbsp;SQL-MM<sup>mm</sup> &nbsp;Supports geography <sup>G</sup></span><div id="content_functions">]]></xsl:text>
<xsl:apply-templates select="/book/chapter[@id='reference']" />
<xsl:text><![CDATA[</div>]]></xsl:text>
<xsl:text><![CDATA[<div id="content_examples">]]></xsl:text>
<!-- examples go here -->
<xsl:if test="$include_examples='true'">
<xsl:apply-templates select="/book/chapter[@id='reference']/sect1[count(//refentry//refsection//programlisting) &gt; 0]" />
</xsl:if>
<xsl:text><![CDATA[</div>]]></xsl:text>
<xsl:text><![CDATA[</body></html>]]></xsl:text>
</xsl:template>
<xsl:template match="chapter" name="function_list">
<![CDATA[<div id="content_functions_left">]]>
<xsl:variable name="col_func_count"><xsl:value-of select="count(descendant::*//funcprototype) div 1.65" /></xsl:variable>
<!--count(preceding-sibling::*/refentry/refsynopsisdiv/funcsynopsis/funcprototype)-->
<xsl:for-each select="sect1[count(//funcprototype) &gt; 0]">
<xsl:variable name="col_cur"><xsl:value-of select="count(current()//funcprototype) + count(preceding-sibling::*//funcprototype)"/></xsl:variable>
<xsl:if test="$col_cur &gt;$col_func_count and count(preceding-sibling::*//funcprototype) &lt; $col_func_count ">
<![CDATA[</div><div id="content_functions_right">]]>
</xsl:if>
<!--Beginning of section -->
<xsl:text><![CDATA[<table class="section"><tr><th colspan="2">]]></xsl:text><xsl:value-of select="title" />
<!-- end of section header beginning of function list -->
<xsl:text><![CDATA[</th></tr>]]></xsl:text>
<xsl:for-each select="refentry">
<!-- add row for each function and alternate colors of rows -->
<!-- , hyperlink to online manual -->
<![CDATA[<tr]]> class="<xsl:choose><xsl:when test="position() mod 2 = 0">evenrow</xsl:when><xsl:otherwise>oddrow</xsl:otherwise></xsl:choose>" <![CDATA[><td colspan='2'><span class='func'>]]><xsl:text><![CDATA[<a href="]]></xsl:text><xsl:value-of select="$linkstub" /><xsl:value-of select="@id" />.html<xsl:text><![CDATA[" target="_blank">]]></xsl:text><xsl:value-of select="refnamediv/refname" /><xsl:text><![CDATA[</a>]]></xsl:text><![CDATA[</span>]]><xsl:if test="contains(.,$new_tag)"><![CDATA[<sup>1</sup> ]]></xsl:if>
<!-- enhanced tag -->
<xsl:if test="contains(.,$enhanced_tag)"><![CDATA[<sup>2</sup> ]]></xsl:if>
<xsl:if test="contains(.,'implements the SQL/MM')"><![CDATA[<sup>mm</sup> ]]></xsl:if>
<xsl:if test="contains(refsynopsisdiv/funcsynopsis,'geography') or contains(refsynopsisdiv/funcsynopsis/funcprototype/funcdef,'geography')"><![CDATA[<sup>G</sup> ]]></xsl:if>
<xsl:if test="contains(.,'GEOS &gt;= 3.4')"><![CDATA[<sup>g3.4</sup> ]]></xsl:if>
<xsl:if test="contains(.,'This function supports 3d')"><![CDATA[<sup>3d</sup> ]]></xsl:if>
<!-- if only one proto just dispaly it on first line -->
<xsl:if test="count(refsynopsisdiv/funcsynopsis/funcprototype) = 1">
(<xsl:call-template name="list_in_params"><xsl:with-param name="func" select="refsynopsisdiv/funcsynopsis/funcprototype" /></xsl:call-template>)
</xsl:if>
<![CDATA[&nbsp;&nbsp;]]>
<xsl:if test="$output_purpose = 'true'"><xsl:value-of select="refnamediv/refpurpose" /></xsl:if>
<!-- output different proto arg combos -->
<xsl:if test="count(refsynopsisdiv/funcsynopsis/funcprototype) &gt; 1"><![CDATA[<span class='func_args'><ol>]]><xsl:for-each select="refsynopsisdiv/funcsynopsis/funcprototype"><![CDATA[<li>]]><xsl:call-template name="list_in_params"><xsl:with-param name="func" select="." /></xsl:call-template><![CDATA[</li>]]></xsl:for-each>
<![CDATA[</ol></span>]]></xsl:if>
<![CDATA[</td></tr>]]>
</xsl:for-each>
<![CDATA[</table><br />]]>
<!--close section -->
</xsl:for-each>
<![CDATA[</div>]]>
</xsl:template>
<xsl:template match="sect1[//refentry//refsection[contains(title,'Example')]]">
<!-- less than needed for converting html tags in listings so they are printable -->
<xsl:variable name="lt"><xsl:text><![CDATA[<]]></xsl:text></xsl:variable>
<!-- only print section header if it has examples - not sure why this is necessary -->
<xsl:if test="refentry/refsection/programlisting">
<!--Beginning of section -->
<xsl:text><![CDATA[<table class='example'><tr><th colspan="2" class="example_heading">]]></xsl:text>
<xsl:value-of select="title" /> Examples
<!-- end of section header beginning of function list -->
<xsl:text><![CDATA[</th></tr>]]></xsl:text>
<!--only pull the first example section of each function -->
<xsl:for-each select="refentry//refsection[contains(title,'Example')][1]/programlisting[1]">
<xsl:variable name='plainlisting'>
<xsl:call-template name="globalReplace">
<xsl:with-param name="outputString" select="."/>
<xsl:with-param name="target" select="$lt"/>
<xsl:with-param name="replacement" select="'&amp;lt;'"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name='listing'>
<xsl:call-template name="break">
<xsl:with-param name="text" select="$plainlisting" />
</xsl:call-template>
</xsl:variable>
<!-- add row for each function and alternate colors of rows -->
<![CDATA[<tr]]> class="<xsl:choose><xsl:when test="position() mod 2 = 0">evenrow</xsl:when><xsl:otherwise>oddrow</xsl:otherwise></xsl:choose>"<![CDATA[>]]>
<![CDATA[<td><b>]]><xsl:value-of select="ancestor::refentry/refnamediv/refname" /><![CDATA[</b><br /><code>]]><xsl:value-of select="$listing" disable-output-escaping="no"/><![CDATA[</code></td></tr>]]>
</xsl:for-each>
<![CDATA[</table>]]>
</xsl:if>
<!--close section -->
</xsl:template>
<!--General replace macro hack to make up for the fact xsl 1.0 does not have a built in one.
Not needed for xsl 2.0 lifted from http://www.xml.com/pub/a/2002/06/05/transforming.html -->
<xsl:template name="globalReplace">
<xsl:param name="outputString"/>
<xsl:param name="target"/>
<xsl:param name="replacement"/>
<xsl:choose>
<xsl:when test="contains($outputString,$target)">
<xsl:value-of select=
"concat(substring-before($outputString,$target),
$replacement)"/>
<xsl:call-template name="globalReplace">
<xsl:with-param name="outputString"
select="substring-after($outputString,$target)"/>
<xsl:with-param name="target" select="$target"/>
<xsl:with-param name="replacement"
select="$replacement"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$outputString"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="break">
<xsl:param name="text" select="."/>
<xsl:choose>
<xsl:when test="contains($text, '&#xa;')">
<xsl:value-of select="substring-before($text, '&#xa;')"/>
<![CDATA[<br/>]]>
<xsl:call-template name="break">
<xsl:with-param
name="text"
select="substring-after($text, '&#xa;')"
/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--macro to pull out function parameter names so we can provide a pretty arg list prefix for each function -->
<xsl:template name="list_in_params">
<xsl:param name="func" />
<xsl:for-each select="$func">
<xsl:if test="count(paramdef/parameter) &gt; 0"> </xsl:if>
<xsl:for-each select="paramdef">
<xsl:choose>
<xsl:when test="not( contains(parameter, 'OUT') )">
<xsl:value-of select="parameter" />
<xsl:if test="position()&lt;last()"><xsl:text>, </xsl:text></xsl:if>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>