<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output
	method="xml"
	indent="yes"
	omit-xml-declaration="yes"
	encoding="ISO-8859-1"/>

<xsl:strip-space elements="*"/>

<xsl:template match="/document">
	<xsl:text>
\documentclass[dvips]{article}

\usepackage{times}

\usepackage[ps2pdf]{hyperref}

\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}

\usepackage{latexsym}
\usepackage[leqno,centertags]{amsmath}

\usepackage{a4wide}
\usepackage{listings}
\usepackage{url}

\usepackage{avm}
%% Listings
\lstset{
   language=XML,%
   frame=lines,
   extendedchars,
   morekeywords={fs,f,sym,s,fsm,fsLib,fLib,vLib,alt},
   breaklines,
   }

\avmvskip{.2ex}
\avmoptions{labeled,sorted}
        </xsl:text>
        <xsl:apply-templates select="title"/>
        <xsl:apply-templates select="author"/>
        <xsl:text>
\begin{document}
\maketitle
\lstlistoflistings
	</xsl:text>
<xsl:apply-templates select="example"/>
	<xsl:text>
\end{document}</xsl:text>
</xsl:template>

<xsl:template match="title">
  \title{<xsl:value-of select="."/>}
</xsl:template>

<xsl:template match="author">
  \author{<xsl:value-of select="."/> \\ \url{<xsl:value-of select="@mail"/>}}
</xsl:template>

<xsl:template match="example">
  <xsl:variable name="label" select="generate-id()"/>
  <xsl:text>\begin{lstlisting}[caption={</xsl:text>
  <xsl:apply-templates select="caption"/>
  <xsl:text>},label=</xsl:text><xsl:value-of select="$label"/><xsl:text>]
</xsl:text>
<xsl:copy-of select="*[name(.) != 'caption']"/>
  \end{lstlisting}
<xsl:if test="@avm = 'true'">
  <xsl:apply-templates select="." mode="avm">
    <xsl:with-param name="label" select="$label"/>
  </xsl:apply-templates>
</xsl:if>
</xsl:template>

<xsl:template match="example" mode="avm">
  <xsl:param name="$label"/>
\begin{figure}[htbp]
\[
  \begin{avm}
  <xsl:apply-templates select="fs" mode="avm"/>
  \end{avm}
\]
  \caption{<xsl:apply-templates select="caption"/> (AVM version of Listing~\ref{<xsl:value-of select="$label"/>})}
\end{figure}
</xsl:template>


<xsl:template match="fs" mode="avm">
  \[{<xsl:value-of select="@type"/>}
  <xsl:apply-templates mode="avm"/>
  \]
</xsl:template>

<xsl:template match="f" mode="avm">
  <xsl:text>\verb@</xsl:text>
  <xsl:value-of select="@name"/>
  <xsl:text disable-output-escaping="yes">@ &amp;</xsl:text>
  <xsl:apply-templates select="@n" mode="avm"/>
  <xsl:apply-templates mode="avm"/>
  <xsl:if test="position()!=last()">
    <xsl:text>\\</xsl:text>
  </xsl:if>
</xsl:template >

<xsl:template match="sym" mode="avm">
  <xsl:value-of select="@value"/>
</xsl:template >

<xsl:template match="plus" mode="avm">
  <xsl:text>+</xsl:text>
</xsl:template>

<xsl:template match="minus" mode="avm">
  <xsl:text>-</xsl:text>
</xsl:template>

<xsl:template match="var" mode="avm">
  <xsl:text>\@{</xsl:text><xsl:value-of select="@name"/>
  <xsl:text>} </xsl:text><xsl:apply-templates mode="avm"/>
</xsl:template>

<xsl:template match="@n" mode="avm">
  <xsl:text>\@{</xsl:text><xsl:value-of select="."/>
  <xsl:text>}</xsl:text>
</xsl:template>

<xsl:template match="vAlt" mode="avm">
  <xsl:for-each select="*">
    <xsl:apply-templates select="." mode="avm"/>
    <xsl:if test="not(position()=last())">\|</xsl:if>
  </xsl:for-each>
</xsl:template>

<xsl:template match="not" mode="avm">
  <xsl:text>$\neg$ \(</xsl:text>
  <xsl:apply-templates mode="avm"/>
  <xsl:text>\)</xsl:text>
</xsl:template>

<xsl:template match="concat" mode="avm">
  <xsl:for-each select="*">
    <xsl:apply-templates select="." mode="avm"/>
    <xsl:if test="not(position()=last())">$\cup$</xsl:if>
  </xsl:for-each>
</xsl:template>

<xsl:template match="vMult[@org='set']|collection[@org='set']" mode="avm">
  \{
  <xsl:for-each select="*">
    <xsl:apply-templates select="." mode="avm"/>
    <xsl:if test="not(position()=last())">,</xsl:if>
  </xsl:for-each>
  \}
</xsl:template>

<xsl:template match="vMult[@org='list']|collection[@org='list']" mode="avm">
  <xsl:text disable-output-escaping="yes">\&lt;</xsl:text>
  <xsl:for-each select="*">
    <xsl:apply-templates select="." mode="avm"/>
    <xsl:if test="not(position()=last())">,</xsl:if>
  </xsl:for-each>
  <xsl:text disable-output-escaping="yes">\&gt;</xsl:text>
</xsl:template>

</xsl:stylesheet>

