title: How to convert flat xml data to hierarchical data xml
body: <p>I have to convert a flat xml to hierarchical xml.
  I have no idea for this task. 
  Below is input for conversion.</p>
  
  <p>Input:-</p>
  
  <pre><code>&lt;body&gt;
      &lt;p class="title"&gt;Article Title&lt;/p&gt;
      &lt;p class="Authors"&gt;abc, pqr and xyz&lt;/p&gt;
      &lt;p class="intro"&gt;here is introdution text......&lt;/p&gt;        
      &lt;p class="head1"&gt;1: Heading level 1&lt;/p&gt;
      &lt;p&gt;some text here&lt;/p&gt;
      &lt;p&gt;some text here&lt;/p&gt;
      &lt;p class="head2"&gt;1.1: Heading  level 2&lt;/p&gt;
      &lt;p&gt;some text here&lt;/p&gt;
      &lt;p&gt;some text here&lt;/p&gt;        
      &lt;p class="head3"&gt;1.1.1: Heading  level 3&lt;/p&gt;
      &lt;p&gt;some text here&lt;/p&gt;
      &lt;p&gt;some text here&lt;/p&gt;        
      &lt;p class="head1"&gt;2: Heading level 1&lt;/p&gt;
      &lt;p class="head2"&gt;2.1: Heading  level 2&lt;/p&gt;
      &lt;p&gt;some text here&lt;/p&gt;
      &lt;p&gt;some text here&lt;/p&gt;        
      &lt;p class="head3"&gt;2.1.1: Heading  level 3&lt;/p&gt;
      &lt;p&gt;some text here&lt;/p&gt;
      &lt;p&gt;some text here&lt;/p&gt;        
      &lt;p class="head3"&gt;2.1.2: Heading  level 3&lt;/p&gt;
      &lt;p&gt;some text here&lt;/p&gt;
      &lt;p&gt;some text here&lt;/p&gt;        
  &lt;/body&gt;
  </code></pre>
  
  <p>I want to convert it to below given xml.</p>
  
  <p>Output:-</p>
  
  <pre><code>&lt;article&gt;
      &lt;title&gt;Article Title&lt;/title&gt;
      &lt;Authors&gt;abc, pqr and xyz&lt;/Authors&gt;
      &lt;introduction&gt;here is introdution text......&lt;/introduction&gt;
      &lt;body&gt;
          &lt;sec level="1"&gt;
              &lt;title&gt;1: Heading level 1&lt;/title&gt;
              &lt;p&gt;some text here&lt;/p&gt;
              &lt;p&gt;some text here&lt;/p&gt;
              &lt;sec level="2"&gt;
                  &lt;title&gt;1.1: Heading  level 2&lt;/title&gt;
                  &lt;p&gt;some text here&lt;/p&gt;
                  &lt;p&gt;some text here&lt;/p&gt;
                  &lt;sec level="3"&gt;
                      &lt;title&gt;1.1.1: Heading  level 3&lt;/title&gt;
                      &lt;p&gt;some text here&lt;/p&gt;
                      &lt;p&gt;some text here&lt;/p&gt;                    
                  &lt;/sec&gt;
              &lt;/sec&gt;
          &lt;/sec&gt;
          &lt;sec level="1"&gt;
              &lt;title&gt;2: Heading level 1&lt;/title&gt;
              &lt;sec level="2"&gt;                
                  &lt;title&gt;2.1: Heading  level 2&lt;/title&gt;
                  &lt;p&gt;some text here&lt;/p&gt;
                  &lt;p&gt;some text here&lt;/p&gt;
                  &lt;sec level="3"&gt;
                      &lt;title&gt;2.1.1: Heading  level 3&lt;/title&gt;
                      &lt;p&gt;some text here&lt;/p&gt;
                      &lt;p&gt;some text here&lt;/p&gt;                        
                  &lt;/sec&gt;
                  &lt;sec level="3"&gt;
                      &lt;title&gt;2.1.2: Heading  level 3&lt;/title&gt;
                      &lt;p&gt;some text here&lt;/p&gt;
                      &lt;p&gt;some text here&lt;/p&gt;                        
                  &lt;/sec&gt;
              &lt;/sec&gt;                
          &lt;/sec&gt;
      &lt;/body&gt;
  &lt;/article&gt;
  </code></pre>
  
  <p>I havn't any idea to convert it using xslt.    </p>
  
  <p>I am getting below Output:-</p>
  
  <pre><code>   &lt;article&gt;
    &lt;p class="title"&gt;Article Title&lt;/p&gt;
    &lt;p class="Authors"&gt;abc, pqr and xyz&lt;/p&gt;
    &lt;p class="intro"&gt;here is introdution text......&lt;/p&gt;
    &lt;body&gt;
       &lt;p class="head1"&gt;1: Heading level 1&lt;/p&gt;
       &lt;p&gt;some text here&lt;/p&gt;
       &lt;p&gt;some text here&lt;/p&gt;
       &lt;p class="head2"&gt;1.1: Heading level 2&lt;/p&gt;
       &lt;p&gt;some text here&lt;/p&gt;
       &lt;p&gt;some text here&lt;/p&gt;
       &lt;p class="head3"&gt;1.1.1: Heading level 3&lt;/p&gt;
       &lt;p&gt;some text here&lt;/p&gt;
       &lt;p&gt;some text here&lt;/p&gt;
       &lt;p class="head1"&gt;2: Heading level 1&lt;/p&gt;
       &lt;p class="head2"&gt;2.1: Heading level 2&lt;/p&gt;
       &lt;p&gt;some text here&lt;/p&gt;
       &lt;p&gt;some text here&lt;/p&gt;
       &lt;p class="head3"&gt;2.1.1: Heading level 3&lt;/p&gt;
       &lt;p&gt;some text here&lt;/p&gt;
       &lt;p&gt;some text here&lt;/p&gt;
       &lt;p class="head3"&gt;2.1.2: Heading level 3&lt;/p&gt;
       &lt;p&gt;some text here&lt;/p&gt;
       &lt;p&gt;some text here&lt;/p&gt;
    &lt;/body&gt;
    &lt;/article&gt;
  </code></pre>
  
  <p>My code is :-</p>
  
  <pre><code>      &lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
       xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"&gt;
       &lt;xsl:output method="xml" indent="yes"/&gt;
       &lt;xsl:strip-space elements="*"/&gt;
  
       &lt;xsl:template match="/"&gt;
          &lt;xsl:apply-templates/&gt;
       &lt;/xsl:template&gt;
  
       &lt;xsl:template match="@* | node()"&gt;
          &lt;xsl:copy copy-namespaces="no"&gt;
             &lt;xsl:apply-templates select="@* | node()"/&gt;
          &lt;/xsl:copy&gt;
       &lt;/xsl:template&gt;
       &lt;xsl:template match="html"&gt;
          &lt;xsl:apply-templates/&gt;
       &lt;/xsl:template&gt;
  
       &lt;xsl:template match="head"/&gt;
       &lt;xsl:template match="body"&gt;
          &lt;xsl:element name="article"&gt;
             &lt;xsl:apply-templates select="p[@class='title']|p[@class='Authors']|p[@class='intro']"/&gt;
             &lt;xsl:element name="body"&gt;
                &lt;xsl:apply-templates select="p[preceding-sibling::p[@class='intro']]"/&gt;
             &lt;/xsl:element&gt;
          &lt;/xsl:element&gt;
       &lt;/xsl:template&gt;
    &lt;/xsl:stylesheet&gt;
  </code></pre>