<!DOCTYPE xsl:stylesheet PUBLIC 'http://www.w3.org/1999/XSL/Transform'
      'http://www.w3.org/People/cmsmcq/lib/xslt10.dtd' [
<!ATTLIST xsl:stylesheet 
  xmlns:xsl CDATA "http://www.w3.org/1999/XSL/Transform" 
  xmlns:xsd CDATA "http://www.w3.org/2001/XMLSchema" 
  xmlns:h   CDATA "http://www.w3.org/1999/xhtml"
>
<!ENTITY mdash  "&#x2014;" ><!--=em dash-->

]>
<xsl:stylesheet 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
 xmlns:h="http://www.w3.org/1999/xhtml"
 version="1.0">
 <xsl:output method="html"/>

 <xsl:template match="*">
  <xsl:element name="span">
   <xsl:attribute name="style">color: red;</xsl:attribute>
   <xsl:value-of select="concat('&lt;',name(),'/&gt;')"/>
  </xsl:element>
 </xsl:template>


 <xsl:template match="xsd:schema">
  <xsl:element name="html">
   <xsl:element name="head">
    <xsl:element name="title">Regex syntax trees</xsl:element>
   </xsl:element>
   <xsl:element name="body">
    <xsl:element name="h1">
     Abstract syntax trees for regexes in XSD 1.1
    </xsl:element>
    <xsl:element name="div">
     <xsl:element name="ul">
      <xsl:apply-templates select="xsd:simpleType" mode="toc"/>
     </xsl:element>
    </xsl:element>
    <xsl:apply-templates/>
   </xsl:element>
  </xsl:element>
 </xsl:template>

 <xsl:template match="xsd:annotation|xsd:documentation|xsd:appinfo|xsd:restriction">
  <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="h:*">
  <xsl:element name="localname()">
   <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>



 <xsl:template match="xsd:simpleType">
  <xsl:element name="h2">
   <xsl:element name="a">
    <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
    <xsl:attribute name="id"><xsl:value-of select="@name"/></xsl:attribute>
    <xsl:value-of select="@name"/>
   </xsl:element>   
  </xsl:element>
  <xsl:element name="div">
   <xsl:attribute name="style">margin-left: 10%;</xsl:attribute>
   <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
 <xsl:template match="xsd:simpleType" mode="toc">
  <xsl:element name="li">
   <xsl:element name="a">
    <xsl:attribute name="href">#<xsl:value-of select="@name"/></xsl:attribute>
    <xsl:value-of select="@name"/>
   </xsl:element>   
  </xsl:element>
 </xsl:template>
 <xsl:template match="xsd:pattern">
  <xsl:element name="p">
   <xsl:element name="code">
    <xsl:value-of select="@value"/>
   </xsl:element>
  </xsl:element>
  <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="ast">
  <xsl:element name="p"><xsl:value-of select="@grammar"/></xsl:element>
  <xsl:element name="ul">
   <xsl:apply-templates/>
  </xsl:element> 
 </xsl:template>

 <xsl:template match="ast[no_parse]">
  <xsl:element name="p">
   <xsl:value-of select="@grammar"/>
   <xsl:text> &mdash; No parse.</xsl:text>
  </xsl:element> 
 </xsl:template>
 
 <xsl:template name="do-children">
  <xsl:choose>
   <xsl:when test="count(*) > 1">
    <xsl:element name="ul">
     <xsl:apply-templates>
      <xsl:with-param name="wrap">li</xsl:with-param>
     </xsl:apply-templates>
    </xsl:element>
   </xsl:when>
   <xsl:when test="count(*) = 1">
    <xsl:apply-templates>
     <xsl:with-param name="wrap">span</xsl:with-param>
    </xsl:apply-templates>
   </xsl:when>
  </xsl:choose>
 </xsl:template>

 <xsl:template match="seq[count(*) > 1]">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:text>sequence of:</xsl:text>
   <xsl:element name="ul">
    <xsl:apply-templates>
     <xsl:with-param name="wrap">li</xsl:with-param>
    </xsl:apply-templates>
   </xsl:element>
  </xsl:element> 
 </xsl:template>

 <xsl:template match="seq[count(*) = 1]">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:apply-templates>
   <xsl:with-param name="wrap" select="$wrap"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="count[@min='1' and @max='1']">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:text>one </xsl:text>
   <xsl:call-template name="do-children"/>
  </xsl:element> 
 </xsl:template>

 <xsl:template match="count[@min='1' and @max='unbounded']">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:text>one or more </xsl:text>
   <xsl:call-template name="do-children"/>
  </xsl:element>  
 </xsl:template>

 <xsl:template match="count[@min='0' and @max='unbounded']">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:text>zero or more </xsl:text>
   <xsl:call-template name="do-children"/>
  </xsl:element>  
 </xsl:template>

 <xsl:template match="count">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:value-of select="concat(@min,' to ',@max,' occurrences of ')"/>
   <xsl:call-template name="do-children"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="re">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:text>(</xsl:text>
   <xsl:call-template name="do-children"/>
   <xsl:text>)</xsl:text>
  </xsl:element>
 </xsl:template>

 <xsl:template match="or">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:text>choice of:  </xsl:text>
   <xsl:call-template name="do-children"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="charClass[mce[@kw]]" mode="old">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:value-of select="concat('Character class:  ',mce/@kw)"/>
   <xsl:call-template name="do-children"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="charClass[mce[@not_kw]]" mode="old">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:value-of select="concat('Character class:  NOT ',mce/@not_kw)"/>
   <xsl:call-template name="do-children"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="charClass">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:text>Character class: </xsl:text>
   <xsl:call-template name="do-children"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="mce">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:text>mce </xsl:text>
   <xsl:choose>
    <xsl:when test="@kw"><xsl:value-of select="@kw"/></xsl:when>
    <xsl:when test="@not_kw"><xsl:value-of select="concat('NOT ',@not_kw)"/></xsl:when>
    <xsl:otherwise> MCE NOT HANDLED.</xsl:otherwise>
   </xsl:choose>
   <xsl:call-template name="do-children"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="sce">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:text>single-character (escaped) "</xsl:text>
   <xsl:value-of select="."/>
   <xsl:text>"</xsl:text>
  </xsl:element>
 </xsl:template>

 <xsl:template match="any_of">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:text>any of </xsl:text>
   <xsl:call-template name="do-children"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="none_of">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:text>any EXCEPT </xsl:text>
   <xsl:call-template name="do-children"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="c">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:value-of select="concat('character &quot;',.,'&quot;')"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="simple_range">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:value-of select="concat('from &quot;',@from,'&quot; to &quot;',@to,'&quot;')"/>
   <xsl:call-template name="do-children"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="difference">
  <xsl:param name="wrap">li</xsl:param>
  <xsl:element name="{$wrap}">
   <xsl:text>Subtraction: any </xsl:text>
   <xsl:element name="ul">
    <xsl:apply-templates select="*[1]">
     <xsl:with-param name="wrap">li</xsl:with-param>
    </xsl:apply-templates>
   </xsl:element>
   <xsl:text>EXCEPT FOR </xsl:text>
   <xsl:element name="ul">
    <xsl:apply-templates select="*[2]">
     <xsl:with-param name="wrap">li</xsl:with-param>
    </xsl:apply-templates>
   </xsl:element>
  </xsl:element>
 </xsl:template>
 
</xsl:stylesheet>
<!-- Keep this comment at the end of the file
Local variables:
mode: xml
sgml-default-dtd-file:"/Library/SGML/Public/Emacs/xslt.ced"
sgml-omittag:t
sgml-shorttag:t
sgml-indent-data:t
sgml-indent-step:1
End:
-->
