<?xml version="1.0"?>

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

  <xsl:output method="text"/>

  <xsl:template match="text()"/>

  <xsl:template match="/">
      <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="grammar">
    <xsl:value-of select="@language"/><xsl:text> Language Syntax

</xsl:text>
    <!--
         <xsl:if test="@version">
           <xsl:text> Version: </xsl:text>
           <xsl:value-of select="@version"/>
           <xsl:text>

           </xsl:text>
         </xsl:if>
         -->
    <xsl:if test="@comment"><xsl:value-of select="@comment"/></xsl:if>
    <xsl:if test="@date">
      <xsl:text>Last modified: </xsl:text><xsl:value-of select="@date"/>
      <xsl:text>
</xsl:text>
    </xsl:if>
    <!--
    <xsl:text>Initial term: </xsl:text>
    <xsl:value-of select="@initial"/>
    <xsl:text>

</xsl:text>
  
    <xsl:choose>
      <xsl:when test="child::part">
        <h3>
          <xsl:text>Contents</xsl:text>
        </h3>
        <ol>
          <xsl:for-each select="child::part">
            <li>
              <a>
                <xsl:attribute name="href">
                  <xsl:text>#PART-</xsl:text>
                  <xsl:value-of select="@name"/>
                </xsl:attribute>
                <xsl:value-of select="@name"/>
              </a>
            </li>
          </xsl:for-each>
          <xsl:if test="descendant::description">
            <li>
              <a href="#PART-description">Description</a>
            </li>
          </xsl:if>
          <li>
            <a href="#PART-non-terminals">Non-terminals</a>
          </li>
          <li>
            <a href="#PART-terminals">Terminals</a>
          </li>
        </ol>
      </xsl:when>
      <xsl:otherwise>
        <a href="#PART-non-terminals">Non-terminals</a>,
        <a href="#PART-terminals">Terminals</a>
      </xsl:otherwise>
    </xsl:choose>
-->

    <xsl:apply-templates/>

    <!--
    <xsl:for-each select="descendant::non-terminal">
      <xsl:variable name="nt" select="@name"/>
      <xsl:if test="count(/descendant::rule[@name=$nt]) = 0">
        <xsl:if test="count(/descendant::system-term[@term=$nt]) = 0">
          <a>
            <xsl:attribute name="href">#<xsl:value-of select="ancestor::rule/@name"/></xsl:attribute>
            <xsl:value-of select="@name"/>.
          </a>
        </xsl:if>
      </xsl:if>
    </xsl:for-each>

    <a>
      <xsl:attribute name="name">PART-terminals</xsl:attribute>
      <b>Usage of terminals</b><xsl:text>:</xsl:text>
    </a>
    <ol>
      <xsl:for-each select="descendant::terminal">
        <xsl:sort select="@symbol"/>
        <xsl:variable name="tsymb" select="@symbol"/>
        <xsl:if test="count(following::terminal[@symbol=$tsymb])=0">
          <li>
            <xsl:text disable-output-escaping="yes">"</xsl:text>
            <b>
              <xsl:value-of select="@symbol"/>
            </b>
            <xsl:text disable-output-escaping="yes">" in </xsl:text>
            <xsl:for-each select="/descendant::terminal[@symbol=$tsymb]">
              <a>
                <xsl:attribute name="href">#<xsl:value-of select="ancestor::rule/@name"/></xsl:attribute>
                <i>
                  <xsl:value-of select="ancestor::rule/@name"/>
                </i>
                <xsl:if test="position() != last()">
                  <xsl:text>, </xsl:text>
                </xsl:if>
              </a>        
            </xsl:for-each>
            <xsl:if test="position() != last()">
              <xsl:text>,</xsl:text>
            </xsl:if>
            <xsl:text>
            </xsl:text>
          </li>
        </xsl:if>
      </xsl:for-each>
    </ol>
    <hr/>
    <address>
      <a><xsl:attribute name="href">http://math.uwb.edu.pl/~bancerek/</xsl:attribute>Grzegorz Bancerek</a>,
      <a><xsl:attribute name="href">mailto:bancerek@mizar.org</xsl:attribute>bancerek@mizar.org</a>
    </address>
-->
  </xsl:template>

  <xsl:template match="part">
    <xsl:text>

********        </xsl:text>
    <xsl:value-of select="@name"/>
    <xsl:text>

</xsl:text>
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="system-terms">
    <xsl:text>
System terms:
      </xsl:text>
    <xsl:apply-templates>
      <xsl:sort select="@term"/>
    </xsl:apply-templates>
    <xsl:text>

</xsl:text>
  </xsl:template>

  <xsl:template match="system-term">
    <a>
      <xsl:attribute name="name"><xsl:value-of select="@term"/></xsl:attribute>
      <i>
        <xsl:value-of select="@term"/>
      </i>
    </a>
    <xsl:if test="position() != last()">
      <xsl:text>,
      </xsl:text>
    </xsl:if>
    <xsl:if test="position() = last()">
      <xsl:text>.
      </xsl:text>
    </xsl:if>
  </xsl:template>
    
  <xsl:template match="rule">
    <xsl:value-of select="@name"/>
    <xsl:text> =</xsl:text>
    <xsl:apply-templates/>
    <xsl:text> .

</xsl:text>
  </xsl:template>

  <xsl:template match="page">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="non-terminal">
    <xsl:variable name="ntname" select="@name"/>
    <xsl:text> </xsl:text>
    <xsl:value-of select="./@name"/>
  </xsl:template>

  <xsl:template match="terminal">
    <xsl:text disable-output-escaping="yes"> "</xsl:text>
    <xsl:value-of select="./@symbol"/>
    <xsl:text disable-output-escaping="yes">"</xsl:text>
  </xsl:template>

  <xsl:template match="subrule[@kind='zero-or-one']">
    <xsl:text> [</xsl:text>
    <xsl:apply-templates/>
    <xsl:text> ]</xsl:text>
  </xsl:template>

  <xsl:template match="subrule[@kind='zero-or-more']">
    <xsl:choose>
      <xsl:when test="descendant::separator">
        <xsl:text> [</xsl:text>
        <xsl:apply-templates select="subrule | terminal | non-terminal"/>
        <xsl:text> {</xsl:text>
        <xsl:apply-templates select="separator"/>
        <xsl:apply-templates select="subrule | terminal | non-terminal"/>
        <xsl:text> } ]</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text> {</xsl:text>
        <xsl:apply-templates/>
        <xsl:text> }</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="subrule[@kind='one-or-more']">
    <xsl:apply-templates select="subrule | terminal | non-terminal"/>
    <xsl:text> {</xsl:text>
    <xsl:apply-templates select="separator"/>
    <xsl:apply-templates select="subrule | terminal | non-terminal"/>
    <xsl:text> }</xsl:text>
  </xsl:template>

  <xsl:template match="subrule[@kind='alternative']">
    <xsl:choose>
      <xsl:when test="count(parent::rule/child::*)&gt;1">
        <xsl:text> (</xsl:text>
      </xsl:when>
      <xsl:when test="count(parent::subrule[@kind!='zero-or-more'])">
        <xsl:text> (</xsl:text>
      </xsl:when>
    </xsl:choose>
    <xsl:for-each select="child::*[position()!=last()]">
      <xsl:apply-templates select="self::*"/>
      <xsl:text> |</xsl:text>
      <!--br-->
    </xsl:for-each>
    <xsl:apply-templates select="child::*[position()=last()]"/>
    <xsl:choose>
      <xsl:when test="count(parent::rule/child::*)&gt;1">
        <xsl:text> )</xsl:text>
      </xsl:when>
      <xsl:when test="count(parent::subrule[@kind!='zero-or-more'])">
        <xsl:text> )</xsl:text>
      </xsl:when>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="description">
    <h2>
      <a name="PART-description">Description</a>
    </h2>
    <xsl:apply-templates>
      <xsl:sort select="subject"/>
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="descitem">
    <p>
      <b>
        <i>
          <a>
            <xsl:attribute name="href">#<xsl:value-of select="@subject"/></xsl:attribute>
            <xsl:attribute name="name">DESC-<xsl:value-of select="@subject"/></xsl:attribute>
            <xsl:value-of select="@subject"/>
          </a>
        </i>
      </b>
      <br>
      </br>
      <xsl:apply-templates/>
    </p>
  </xsl:template>

  <xsl:template match="ref">
    <a>
      <xsl:attribute name="href">#<xsl:value-of select="@target"/></xsl:attribute>
      <xsl:value-of select="@target"/>
    </a>
  </xsl:template>
</xsl:stylesheet>

