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

XSLT 1.0: Grouping Adjacent Elements in Embedded Lists

Subject: XSLT 1.0: Grouping Adjacent Elements in Embedded Lists
From: "Joe Heidenreich" <HeidenreichJ@xxxxxxxx>
Date: Thu, 4 Nov 2004 15:21:51 -0500
html embedded lists
Hello,

Essentially I'm trying to create a two-tiered embedded list from a flat list
in which I need to group by adjacent like items.

<OL_LI> = Ordered List Items
<EM_OL_LI> = Embedded Ordered List Items

Sample Input is:

	<OL_LI>Top: Item 1</OL_LI>
	<EM_OL_LI>Sub A: Item 1</EM_OL_LI>
	<OL_LI>Top: Item 2</OL_LI>
	<EM_OL_LI>Sub B: Item 1</EM_OL_LI>
	<EM_OL_LI>Sub B: Item 2</EM_OL_LI>
	<EM_OL_LI>Sub B: Item 3</EM_OL_LI>
	<OL_LI>Top: Item 3<OL_LI>
	<EM_OL_LI>Sub C: Item 1</EM_OL_LI>
	<EM_OL_LI>Sub C: Item 2<EM_OL_LI>



Desired Output is:

	<p>
	   <ol>
	      <li>Top: Item 1</li>
	      <p>
	         <ol>
	            <li>Sub A: Item 1</li>
	         </ol>
	      </p>
	      <li>Top: Item 2</li>
	      <p>
	         <ol>
	            <li>Sub B: Item 1</li>
	            <li>Sub B: Item 2</li>
	            <li>Sub B: Item 3</li>
	         </ol>
	      </p>
	      <li>Top: Item 3</li>
	      <p>
	         <ol>
	            <li>Sub C: Item 1</li>
	            <li>Sub C: Item 2</li>
	         </ol>
	      </p>
	   </ol>
	</p>




My Current Transform looks like this:

	<xsl:template match="OL_LI">
	   <xsl:if test="not(preceding-sibling::*[1][self::OL_LI])">
	      <p>
	         <ol>
	            <xsl:apply-templates select="." mode="li"/>
	         </ol>
	      </p>
	   </xsl:if>
	</xsl:template>

	<xsl:template match="OL_LI" mode="li">
	   <li><xsl:apply-templates /></li>
	   <xsl:apply-templates select="following-sibling::*[1][self::EM_OL_LI]"/>
	   <xsl:apply-templates select="following-sibling::*[1][self::OL_LI]"
mode="li"/>
	</xsl:template>

	<xsl:template match="EM_OL_LI">
	   <xsl:if test="not(preceding-sibling::*[1][self::EM_OL_LI])">
	      <p>
	         <ol>
	            <xsl:apply-templates select="." mode="li"/>
	         </ol>
	      </p>
	   </xsl:if>
	</xsl:template>

	<xsl:template match="EM_OL_LI" mode="li">
	   <li><xsl:apply-templates/></li>
	   <xsl:apply-templates select="following-sibling::*[1][self::EM_OL_LI]"
mode="li"/>
	</xsl:template>




However, my current output looks like this:

	<p>
	   <ol>
	      <li>Top: Item 1</li>
	      <p>
	         <ol>
	            <li>Sub A: Item 1</li>
	         </ol>
	      </p>
	   </ol>
	</p>

	<p>
	   <ol>
	      <li>Top: Item 2</li>
	      <p>
	         <ol>
	            <li>Sub B: Item 1</li>
	            <li>Sub B: Item 2</li>
	            <li>Sub B: Item 3</li>
	         </ol>
	      </p>
	   </ol>
	</p>

	<p>
	   <ol>
	      <li>Top: Item 3</li>
	      <p>
	         <ol>
	            <li>Sub C: Item 1</li>
	            <li>Sub C: Item 2</li>
	         </ol>
	      </p>
	   </ol>
	</p>

And it is separated into 3 separate lists. The inner list portion is working
fine. What seems to be tripping me up is that the top level <ol> tag is
closing before I want it to.
I'm pretty sure I have to edit this part to account for the case when
preceding-sibling is <EM_OL_LI>

	 <xsl:if test="not(preceding-sibling::*[1][self::OL_LI])">
	      <p>
	         <ol>
	            <xsl:apply-templates select="." mode="li"/>
	         </ol>
	      </p>
	   </xsl:if>

But my attempts have been fruitless. This is a condensed version of what I'm
doing. I also have to account of embedded unordered lists. The current
transformation works great for non-embedded lists as well, which is something
I have to handle. Any help would be greatly appreciated.
And if someone could explain to me the difference between [self::OL_LI] and
[OL_LI] that would be an added educational bonus. Thanks!

-Joe

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.