<?xml version="1.0" encoding="UTF-8"?>
<!-- @(#)$Id: MetaXSL+.xsl,v 1.2 2003/05/23 11:07:57 ali Exp $ -->

<xsl:stylesheet version="1.0"
		xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="root">root</xsl:param>  

<xsl:template match="xsd:schema">

  <xsl:text disable-output-escaping="yes">&lt;xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;
&lt;xsl:strip-space elements="*"/&gt;
  </xsl:text>

  <xsl:apply-templates>
    <xsl:with-param name="path" select="$root"/>
  </xsl:apply-templates>    
  <xsl:text disable-output-escaping="yes">
&lt;/xsl:stylesheet&gt;
  </xsl:text>
</xsl:template>

<xsl:template name="elem_insert_loop">
  <xsl:param name="name"/>
  <xsl:param name="a" select="1" />
  <xsl:param name="number"/>
  <!-- Use your a -->
  <xsl:value-of select="@a"/>
  <xsl:element name="xsl:element">
    <xsl:attribute name="name">
      <xsl:value-of select="@name"/>
    </xsl:attribute>
  </xsl:element> 
  <!-- Test condition and call template if less than number -->
  <xsl:if test="$a &lt; $number">
    <xsl:call-template name="elem_insert_loop">
      <xsl:with-param name="a" select="$a + 1"/>
      <xsl:with-param name="number" select="$number"/>
      <xsl:with-param name="name" select="$name"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>

<xsl:template name="complex_insert_loop">
  <xsl:param name="name"/>
  <xsl:param name="a" select="1" />
  <xsl:param name="number"/>
  <xsl:element name="xsl:element">
    <xsl:attribute name="name">
      <xsl:value-of select="$name"/>
    </xsl:attribute>
    <xsl:apply-templates select="*" mode="insert"/>
  </xsl:element>
  <xsl:if test="$a &lt; $number">
    <xsl:call-template name="complex_insert_loop">
      <xsl:with-param name="a" select="$a + 1"/>
      <xsl:with-param name="number" select="$number"/>
      <xsl:with-param name="name" select="$name"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>

<xsl:template match="xsd:element" mode="insert">
<xsl:variable name="elmname" select="@name"/>
<xsl:variable name="mytype" select="@type"/>
<xsl:variable name="mymin" select="@minOccurs"/>
  <xsl:choose>
    <xsl:when test="$mytype">
      <xsl:choose>
        <xsl:when test="@minOccurs&gt;'1'">
          <xsl:call-template name="elem_insert_loop">
            <xsl:with-param name="number" select="@minOccurs"/>
            <xsl:with-param name="name" select="@elmname"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="@minOccurs='0'"/>
        <xsl:otherwise>
          <xsl:element name="xsl:element">
           <xsl:attribute name="name">
             <xsl:value-of select="@name"/>
           </xsl:attribute>
          </xsl:element>
        </xsl:otherwise> 
      </xsl:choose>
    </xsl:when>
  </xsl:choose>
  <xsl:apply-templates select="*" mode="insert"/>
</xsl:template>

<xsl:template match="xsd:element">
<xsl:param name="path"/>
<xsl:variable name="min" select="@minOccurs"/>
<xsl:variable name="elmname" select="@name"/>
<xsl:variable name="mytype" select="@type"/>
<xsl:variable name="current" select="concat($path, @name)"/>
  <xsl:choose>
    <xsl:when test="$mytype">
      
      <xsl:element name="xsl:template">
        <xsl:attribute name="match">
          <xsl:value-of select="@name"/>
        </xsl:attribute>
        <xsl:element name="xsl:element">
          <xsl:attribute name="name">
            <xsl:value-of select="@name"/>
          </xsl:attribute>
          <xsl:element name="xsl:value-of">
            <xsl:attribute name="select">
              <xsl:text>.</xsl:text>
            </xsl:attribute>
          </xsl:element>
        </xsl:element>   
      </xsl:element>
     
      <xsl:element name="xsl:template">
        <xsl:attribute name="match">
          <xsl:value-of select="concat('insert-', @name)"/>
        </xsl:attribute>
        <xsl:element name="xsl:element">
          <xsl:attribute name="name">
            <xsl:value-of select="@name"/>
          </xsl:attribute>
        </xsl:element> 
      </xsl:element>   
      
    </xsl:when>
  </xsl:choose>
  <xsl:apply-templates select="*">
    <xsl:with-param name="path" select="concat($path, @name)"/>
  </xsl:apply-templates> 
</xsl:template>

<xsl:template match="xsd:complexType">
  <xsl:param name="path"/>
  <xsl:variable name="current" select="concat($path, ../@name)"/>
  <xsl:element name="xsl:template">
    <xsl:attribute name="match">
      <xsl:value-of select="../@name"/>
    </xsl:attribute>
    <xsl:element name="xsl:element">
      <xsl:attribute name="name">
        <xsl:value-of select="../@name"/>
      </xsl:attribute>
      <xsl:element name="xsl:apply-templates">
        <xsl:attribute name="select">
          <xsl:text>*</xsl:text>
        </xsl:attribute>
      </xsl:element>   
    </xsl:element>   
  </xsl:element>
  <xsl:apply-templates select="*">
    <xsl:with-param name="path" select="$path"/>
  </xsl:apply-templates>  
  <xsl:element name="xsl:template">
      <xsl:attribute name="match">
        <xsl:value-of select="concat('insert-', ../@name)"/>
      </xsl:attribute>
      <xsl:element name="xsl:element">
        <xsl:attribute name="name">
          <xsl:value-of select="../@name"/>
        </xsl:attribute>
        <xsl:apply-templates select="*" mode="insert">
          <xsl:with-param name="path" select="concat($path, ../@name)"/>
        </xsl:apply-templates>
      </xsl:element>  
    </xsl:element>   
</xsl:template>

<xsl:template match="xsd:complexType" mode="insert">
<xsl:choose>  
  <xsl:when test="../@minOccurs&gt;'1'">
    <xsl:call-template name="complex_insert_loop">
      <xsl:with-param name="number" select="../@minOccurs"/>
      <xsl:with-param name="name" select="../@name"/>
    </xsl:call-template>
  </xsl:when>  
  <xsl:when test="../@minOccurs='0'"/>
  <xsl:otherwise>
    <xsl:element name="xsl:element">
      <xsl:attribute name="name">
        <xsl:value-of select="../@name"/>
      </xsl:attribute>
      <xsl:apply-templates select="*" mode="insert"/>
    </xsl:element>
  </xsl:otherwise> 
</xsl:choose>   
</xsl:template>


<xsl:template match="xsd:sequence">
  <xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
