[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Suggestion for converting from flat file to a structur

Subject: Suggestion for converting from flat file to a structured html type list
From: "Nicholas Waltham" <info@xxxxxxxxxxxx>
Date: Mon, 15 Oct 2001 11:11:12 +0200
l2 items id
Hello All,
I have been working on this just lately, and I wondered if I could have your
feedback. It may also be useful in a more general context. Its based on help
here, and also from the FAQs.

Regards,
Nicholas Waltham

-----------Source File ----------

<?xml version="1.0" encoding="UTF-8"?>
<doc>
 <p style="Normal">Normal</p>
 <p style="L1"> - 1.1</p>
 <p style="L1"> - 1.2</p>
 <p style="L1"> - 1.3</p>
 <p style="L1"> - 1.4</p>
 <p style="L2"> - 1.4.1</p>
 <p style="L2"> - 1.4.2</p>
 <p style="L3"> - 1.4.2.1</p>
 <p style="L1">- 1.5</p>
 <p style="L1">- 1.6</p>
 <p style="Normal">Normal</p>
 <p style="L1">b First Level 1</p>
 <p style="L1">b Second Level 1</p>
 <p style="L2">b First <em>Level</em> 2</p>
 <p style="L2">b Second Level 2</p>
 <p style="L3">b First Level 3</p>
 <p style="L2">c Second Level 2</p>
 <p style="L3">c First Level 3</p>
 <p style="L1">b Third <em>Level</em> 1</p>
 <p style="L1">b Forth Level 1</p>
</doc>

-----------Desired Output ----------

<html>
<body bgcolor="#ffffff">
 Normal
 <ol>
<li> - 1.1</li>
<li> - 1.2</li>
<li> - 1.3</li>
<li> - 1.4</li>
<ol>
<li> - 1.4.1</li>
<li> - 1.4.2</li>
<ol>
<li> - 1.4.2.1</li>
</ol>
</ol>
<li>- 1.5</li>
<li>- 1.6</li>
</ol>
Normal
<ol>
<li>b First Level 1</li>
<li>b Second Level 1</li>
<ol>
<li>b First <em>Level</em> 2</li>
<li>b Second Level 2</li>
<ol>
<li>b First Level 3</li>
</ol>
<li>c Second Level 2</li>
<ol>
<li>c First Level 3</li>
</ol>
</ol>
<li>b Third <em>Level</em> 1</li>
<li>b Forth Level 1</li>
</ol>
</body>
</html>

-----------XSL to do the job ----------

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>

<!--Items in a list which are not the first items /ie list continuation
items-->
<xsl:key name='listitems1' match="p[@style='L1'and
preceding-sibling::p[1][@style='L1'
   or @style='L2' or @style='L3']]"
   use="generate-id(preceding-sibling::p[@style='L1'][1])"/>

<xsl:key name='listitems2' match="p[@style='L2'and preceding-sibling::p[1][
   @style='L2' or @style='L3']]"
   use="generate-id(preceding-sibling::p[@style='L2' and
preceding-sibling::p[1][@style='L1']][1])"/>

<xsl:key name='listitems3' match="p[@style='L3'and
preceding-sibling::p[1][@style='L3']]"
   use="generate-id(preceding-sibling::p[@style='L3' and
preceding-sibling::p[1][@style='L2']][1])"/>

<!--First Items in sublists-->
<xsl:key name='sublistitems2' match="p[@style='L2' and
preceding-sibling::p[1][@style='L1']]"
   use="generate-id(preceding-sibling::p[@style='L1'][1])"/>

<xsl:key name='sublistitems3' match="p[@style='L3' and
preceding-sibling::p[1][@style='L2']]"
   use="generate-id(preceding-sibling::p[@style='L2'][1])"/>

<!--Process Level 1 Lists-->
<xsl:template match="p[@style='L1']" mode="startlist">
<xsl:apply-templates select="." mode="Items"/>
<xsl:apply-templates select="key('sublistitems2', generate-id())"
mode="openlist"/>
<xsl:apply-templates select="key('listitems1', generate-id())"
mode="startlist"/>
</xsl:template>

<!--Process Level 2 Lists-->
<xsl:template match="p[@style='L2']" mode="startlist">
 <xsl:apply-templates select="." mode="Items"/>
 <xsl:apply-templates select="key('sublistitems3', generate-id())"
mode="openlist"/>
 <xsl:apply-templates select="key('listitems2', generate-id())"
mode="startlist"/>
</xsl:template>

<!--Process Level 3 Lists-->
<xsl:template match="p[@style='L3']" mode="startlist">
 <xsl:apply-templates select="." mode="Items"/>
 <xsl:apply-templates select="key('listitems3', generate-id())"
mode="startlist"/>
</xsl:template>

<!--Start a list if the contents is not empty-->
<xsl:template match="p[@style='L1'or @style='L2' or @style='L3']"
mode="openlist">
<xsl:if test="string(.)!=''">
<ol>
<xsl:apply-templates select="." mode="startlist"/>
</ol>
</xsl:if>
</xsl:template>

<!--Output Individual List Items-->
<xsl:template match="p[@style='L1'or @style='L2' or @style='L3']"
mode="Items">
<xsl:if test="string(.)!=''">
<li>
<xsl:copy-of select="node()"/>
</li>
</xsl:if>
</xsl:template>

<!--Pick out the first level 1 item in a list, dump other items -->
<xsl:template match="p[@style='L1'or @style='L2' or @style='L3']" >
<xsl:if test="@style='L1' and not (preceding-sibling::p[1][@style='L1'or
@style='L2' or @style='L3'])">
<ol>
<xsl:apply-templates select="." mode="startlist"/>
</ol>
</xsl:if>
</xsl:template>

<xsl:template match="/">
<html>
<head>
</head>
<body bgcolor="#ffffff">
<xsl:apply-templates />
</body>
</html>
</xsl:template>

</xsl:stylesheet>



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.