Go Back   CodingForums.com > :: Client side development > XML

Before you post, read our: Rules & Posting Guidelines

Reply
 
Thread Tools Rate Thread
Enjoy an ad free experience by logging in. Not a member yet? Register.
Old 05-17-2011, 07:10 PM   PM User | #1
nileshdchavan
New to the CF scene

 
Join Date: May 2011
Posts: 1
Thanks: 0
Thanked 0 Times in 0 Posts
nileshdchavan is an unknown quantity at this point
Post Query in XSLT Coding - building Hierarchy

hello,

I want to convert data in the following format into the hierarchically/structured data maintaining the levels. Could you please help me writing the XSLT. I've been implementing the logic but not able to complete it.

Here's the sample input:
Code:
<?xml version="1.0"?>
<HTML>
  <BODY LANG="EN-US" STYLE="text-justify-trim:punctuation">
    <DIV CLASS="WordSection1">
      <P CLASS="ahead" STYLE="margin-left:0in;text-indent:0in">A</P>
      <P CLASS="ahead" STYLE="margin-left:0in;text-indent:0in"></P>
      <P CLASS="Main">
        <B>ABSOLUTE DEEDS AS MORTGAGES,</B> 2.01
      </P>
      <P CLASS="Main"></P>
      <P CLASS="Main">
        <B>ACCELERATION OF OBLIGATION,</B> 5.01 to5.04. (<I>See</I> <B>DEFAULT AND ACCELERATION OFOBLIGATION</B>)
      </P>
      <P CLASS="Main"></P>
      <P CLASS="Main">
        <B>AFFIDAVITS</B>
      </P>
      <P CLASS="Sub1">Attorneys' fees</P>
      <P CLASS="Sub2">Affidavit of independent counsel in support ofaward, Form p. 503</P>
      <P CLASS="Sub1">Costs, affidavit as to, Form p. 504</P>
      <P CLASS="Sub1">Financial affidavit, Form p. 452</P>
      <P CLASS="Sub2">Constructive service</P>
      <P CLASS="Sub3">Publication, service by</P>
      <P CLASS="Sub4">Affidavit demonstrating due diligence,11.08</P>
      <P CLASS="Sub2">Default judgment against defendant who hasn'tanswered</P>
      <P CLASS="Sub3">Non-military affidavit, 11.10, Form p.466</P>
      <P CLASS="Sub1">Summary judgment motion, affidavits supporting,13.03, Form p. 484</P>
      <P CLASS="Sub1"></P>
      <P CLASS="Main">
        <B>AFFIRMATIVE DEFENSES</B>
      </P>
      <P CLASS="Sub1">
        Avoidances to defenses, 27. (<I>See</I><B>AVOIDANCES</B>)
      </P>
      <P CLASS="Sub1">
        Defenses generally. (<I>See</I><B>DEFENSES</B>)
      </P>
      <P CLASS="Sub2">Breach of contract, statute of frauds</P>
      <P CLASS="Sub3">Affirmative defenses not precluded, 29.03</P>
</DIV>
</BODY>
</HTML>
------------------------------------------------
Here's corresponding sample output for the data above:
Code:
<?xml version="1.0"?>
<em:index>
  <title>Index</title>
  <title-alt use4="r-running-hd">INDEX</title-alt>
  <title-alt use4="l-running-hd">INDEX</title-alt>
  <in:body>
    <level0>
       <letter>A</letter>
       <level1><B>ABSOLUTE DEEDS AS MORTGAGES,</B> 2.01</level1>
       <level1></level1>
       <level1><B>ACCELERATION OF OBLIGATION,</B> 5.01 to5.04. (<I>See</I> <B>DEFAULT AND ACCELERATION OFOBLIGATION</B>)</level1>
       <level1></level1>
       <level1><B>AFFIDAVITS</B>
         <level2> Attorneys' fees
           <level3> Affidavit of independent counsel in support ofaward, Form p. 503</level3>
         </level2>
         <level2> Costs, affidavit as to, Form p. 504 </level2>
         <level2> Financial affidavit, Form p. 452 
           <level3> Constructive service 
             <level4> Publication, service by 
               <level5> Affidavit demonstrating due diligence,11.08 </level5>
             </level4>
           </level3>
           <level3> Default judgment against defendant who hasn'tanswered 
             <level4> Non-military affidavit, 11.10, Form p.466</level4>
           </level3>
         </level2>
         <level2> Summary judgment motion, affidavits supporting,13.03, Form p. 484</level2>
         <level2></level2>
       </level1>
       <level1> AFFIRMATIVE DEFENSES 
         <level2> Avoidances to defenses, 27. (<I>See</I><B>AVOIDANCES</B>)</level2>
         <level2> Defenses generally. (<I>See</I><B>DEFENSES</B>)
           <level3> Breach of contract, statute of frauds 
             <level4> Affirmative defenses not precluded, 29.03</level4>
           </level3>
         </level2>
       </level1>
    </level0>
  </in:body>
</em:index>
---------------------------------------------------
Here's the sample XSLT i have written:
Code:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()">
    <!--<xsl:copy>-->
      <xsl:apply-templates select="@* | node() "/>
    <!--</xsl:copy>-->
  </xsl:template>

<xsl:template match="HEAD"/>
<xsl:template match="B | I">
  <xsl:apply-templates/>
</xsl:template>


  <xsl:template match="DIV" >
    <xsl:copy>
      <xsl:apply-templates select="@* | P[@CLASS = 'ahead'] "/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="P[@CLASS = 'ahead']" >
    <xsl:variable name="vContents" select="normalize-space(.)"/>
	<xsl:choose>
      <xsl:when test="string-length($vContents) &gt; 0" >
	    <xsl:element name="LEVEL0">
          <xsl:copy>
            <xsl:value-of select="."/>
          </xsl:copy>
          <xsl:apply-templates select="following-sibling::P" />
        </xsl:element>
	  </xsl:when>
	  <xsl:otherwise>
		   <xsl:apply-templates select="following-sibling::P"/>
	  </xsl:otherwise>
	</xsl:choose>
  </xsl:template>

  <xsl:template match="P[@CLASS = 'Main']" >
    <xsl:variable name="vContents" select="normalize-space(.)"/>
	  <xsl:choose>
	    <xsl:when test="string-length($vContents) &gt; 0" >
        <xsl:element name="LEVEL1">
          <xsl:copy>
            <xsl:value-of select="."/>
          </xsl:copy>
          <!--<xsl:apply-templates select="following-sibling::P[@CLASS = 'Sub1'] " />-->
        <xsl:apply-templates select="following-sibling::P[1][not(@CLASS = 'Main')] " />
        </xsl:element>
    </xsl:when>
      <xsl:otherwise>
        <xsl:element name="LEVEL1"></xsl:element>
        <xsl:apply-templates select="following-sibling::P[1][not(@CLASS = 'Main')] " />
        
      </xsl:otherwise>
	  </xsl:choose>
    
  </xsl:template>

  <xsl:template match="P[@CLASS = 'Sub1']" >
    <xsl:variable name="vContents" select="normalize-space(.)"/>
    <xsl:choose>
      <xsl:when test="string-length($vContents) &gt; 0" >
    <xsl:element name="LEVEL2">
    <xsl:copy>
      <xsl:value-of select="."/>
    </xsl:copy>
	  <xsl:apply-templates select="following-sibling::P[1][not(@CLASS = 'Sub1')]" />
       </xsl:element>
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates select="following-sibling::P[1][not(@CLASS = 'Sub1')] " />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  
  <xsl:template match="P" >
    <xsl:variable name="Curr_Level" select="translate(@CLASS, 'Sub', '') + 1"/>
    <xsl:variable name="Prec_Level">
      <xsl:value-of select="translate(preceding-sibling::P[1]/@CLASS, 'Sub', '') + 1 "/>
    </xsl:variable>
    <xsl:variable name="Foll_Level">
      <xsl:value-of select="translate(following-sibling::P[1]/@CLASS, 'Sub', '') + 1"/>
    </xsl:variable>

    <xsl:variable name="vTempLevel" select="concat('Sub',$Curr_Level)"/>

    <xsl:choose>
      <xsl:when test="$Prec_Level  &lt; $Curr_Level">
        <xsl:element name="{concat('LEVEL', $Curr_Level)}">
          <xsl:copy>
            <xsl:value-of select="."/>
          </xsl:copy>
          <xsl:if test="not($Curr_Level &gt; $Foll_Level) ">
            <xsl:apply-templates select="following-sibling::P[1][not(@CLASS = 'Sub1')]" />
          </xsl:if>
        </xsl:element>
      </xsl:when>

      <xsl:when test="$Prec_Level = $Curr_Level">
        <xsl:copy>
          <xsl:value-of select="."/>
        </xsl:copy>
        <xsl:if test="not($Curr_Level &gt; $Foll_Level) ">
          <xsl:apply-templates select="following-sibling::P[1][not(@CLASS = 'Sub1')]" />
        </xsl:if>
      </xsl:when>

      <xsl:otherwise>
        <xsl:element name="{concat('LEVEL', $Curr_Level)}">
          <xsl:copy>
            <xsl:value-of select="."/>
          </xsl:copy>
          <xsl:if test="not($Curr_Level &gt; $Foll_Level)">
            <xsl:apply-templates select="following-sibling::P[1][not(@CLASS = 'Sub1')]" />
          </xsl:if>
        </xsl:element>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>
---------------------------------------------------

Please let me know the solution as soon as possible. This is very critical.

Thanks!!
Nilesh.
mrsnchavan@yahoo.co.in

Last edited by Alex Vincent; 05-18-2011 at 01:37 AM.. Reason: Adding code tags
nileshdchavan is offline   Reply With Quote
Reply

Bookmarks

Tags
hierarchical, level, xslt

Jump To Top of Thread


Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +1. The time now is 05:48 PM.


Advertisement
Log in to turn off these ads.