[xsl] Group Techniques by xslt

Subject: [xsl] Group Techniques by xslt
From: "Joga Singh Rawat" <jrawat@xxxxxxxxxxxxxx>
Date: Wed, 2 Dec 2009 15:02:11 +0530
Hi Team,
If someone have a logic to structure a data of unstructred file, please
help. I am clueless. I am new in xslt 2.0.

Input
<div class="bdy">
<p class="Para_FL">Para 1 many <i>inline</i> tags are possible here</p>
<p class="Head2">xx <b>Head2</b>: Introduction</p>
<p class="Para_FL">Para <b>2</b> xxx</p>
<p class="Para_FL">para <i>3</i> xxx </p>

<p class="Head1">Head1: Intro<i>d</i>uction</p>
<p class="Para_FL">Para <b>4</b> xxx </p>
<p class="Para_FL">para <i>5</i> sss</p>

<p class="Head2">Head 2: Intro<u>d</u>uction</p>
<p class="Para_FL">Para <b>6</b> xxx</p>
<p class="Para_FL">para <i>7</i> sss</p>

<p class="Head2">Head 2: Intro<u>d</u>uction</p>
<p class="Para_FL">Para <b>8</b> xxx</p>
<p class="Para_FL">para <i>9</i> fff</p>

<p class="Head3">Head 3: Intro<u>d</u>uction</p>
<p class="Para_FL">Para <b>10</b> vvv</p>
<p class="Para_FL">para <i>11</i> ggg</p>

<p class="Head4">Head 4: Intro<u>d</u>uction</p>
<p class="Para_FL">Para <b>12</b> ggg</p>
<p class="Para_FL">para <i>13</i> rr</p>

<p class="Head5">Head 5: Intro<u>d</u>uction</p>
<p class="Para_FL">Para <b>14</b> fff</p>
<p class="Para_FL">para <i>15</i> fff</p>

<p class="Head6">Head 6: Intro<u>d</u>uction</p>
<p class="Para_FL">Para <b>16</b> ff</p>
<p class="Para_FL">para <i>17</i> tt</p>

<p class="Head2">Head 2: Intro<u>d</u>uction</p>
<p class="Para_FL">Para <b>18</b> dd</p>
<p class="Para_FL">para <i>19</i> ff</p>

<p class="Head5">Head 5: Intro<u>d</u>uction</p>
<p class="Para_FL">Para <b>20</b> ff</p>
<p class="Para_FL">para <i>21</i> ff</p>
</div>

Required OUTPUT
<bdy>
  <p t="fl">Para 1 many <i>inline</i> tags are possible here</p>
  <sc1>
    <sc2>
     <ti>xx <b>Head2</b>: Introduction</ti>
     <p t="fl">Para <b>2</b> xxx</p>
     <p t="fl">para <i>3</i> xxx </p>
    </sc2>
  </sc1>
  <sc1>
     <ti>Head1: Intro<i>d</i>uction</ti>
     <p t="fl">Para <b>4</b> xxx </p>
     <p t="fl">para <i>5</i> sss</p>
     <sc2>
       <ti>Head 2: Intro<u>d</u>uction</ti>
       <p t="fl">Para <b>6</b> xxx</p>
       <p t="fl">para <i>7</i> sss</p>
     </sc2>
     <sc2>
       <ti>Head 2: Intro<u>d</u>uction</ti>
       <p t="fl">Para <b>8</b> xxx</p>
       <p t="fl">para <i>9</i> fff</p>
       <sc3>
         <ti>Head 3: Intro<u>d</u>uction</ti>
         <p t="fl">Para <b>10</b> vvv</p>
         <p t="fl">para <i>11</i> ggg</p>
         <sc4>
           <ti>Head 4: Intro<u>d</u>uction</ti>
           <p t="fl">Para <b>12</b> ggg</p>
           <p t="fl">para <i>13</i> rr</p>
           <sc5>
             <ti>Head 5: Intro<u>d</u>uction</ti>
             <p t="fl">Para <b>14</b> fff</p>
             <p t="fl">para <i>15</i> fff</p>
             <sc6>
               <ti>Head 6: Intro<u>d</u>uction</ti>
               <p t="fl">Para <b>16</b> ff</p>
               <p t="fl">para <i>17</i> tt</p>
             </sc6>
          </sc5>
        </sc4>
      </sc3>
    </sc2>
  </sc1>
  <sc1>
    <sc2>
      <ti>Head 2: Intro<u>d</u>uction</ti>
      <p t="fl">Para <b>18</b> dd</p>
      <p t="fl">para <i>19</i> ff</p>
      <sc3>
        <sc4>
          <sc5>
           <ti>Head 5: Intro<u>d</u>uction</ti>
           <p t="fl">Para <b>20</b> ff</p>
           <p t="fl">para <i>21</i> ff</p>
          </sc5>
        </sc4>
      </sc3>
    </sc2>
  </sc1>
</bdy>

XSL
<xsl:template match="div[@class='bdy']">
 <bdy>
  <xsl:for-each-group select="*"
group-starting-with="p[@class='Head1']|p[@class='Head2']">
   <xsl:apply-templates select="." mode="group" />
  </xsl:for-each-group>
 </bdy>
</xsl:template>

<xsl:template match="p[@class='Head1']" mode="group">
 <sc1>
  <ti><xsl:apply-templates/></ti>
  <xsl:for-each-group select="current-group() except ."
group-starting-with="p[@class='Head2']">
   <xsl:apply-templates select="current-group()" mode="group"/>
  </xsl:for-each-group>
 </sc1>
</xsl:template>

<xsl:template match="p[@class='Head2']" mode="group">
 <sc2>
  <ti><xsl:apply-templates/></ti>
  <xsl:for-each-group select="current-group() except ."
group-starting-with="p[@class='Head3']">
   <xsl:apply-templates select="current-group()" mode="group"/>
  </xsl:for-each-group>
  </sc2>
</xsl:template>

<xsl:template match="p[@class='Head3']" mode="group">
 <sc3>
  <ti><xsl:apply-templates/></ti>
  <xsl:for-each-group select="current-group() except ."
group-starting-with="p[@class='Head4']">
   <xsl:apply-templates select="current-group()" mode="group"/>
  </xsl:for-each-group>
  </sc3>
</xsl:template>

<xsl:template match="p[@class='Head4']" mode="group">
 <sc4>
  <ti><xsl:apply-templates/></ti>
  <xsl:for-each-group select="current-group() except ."
group-starting-with="p[@class='Head5']">
   <xsl:apply-templates select="current-group()" mode="group"/>
  </xsl:for-each-group>
  </sc4>
</xsl:template>

<xsl:template match="p[@class='Head5']" mode="group">
 <sc5>
  <ti><xsl:apply-templates/></ti>
  <xsl:for-each-group select="current-group() except ."
group-starting-with="p[@class='Head6']">
   <xsl:apply-templates select="current-group()" mode="group"/>
  </xsl:for-each-group>
  </sc5>
</xsl:template>

Thanks
...JSR

Current Thread