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

How to form correct structure

Subject: How to form correct structure
From: "David O Baldwin" <david.baldwin@xxxxxxxxxxxx>
Date: Mon, 10 Sep 2001 16:35:59 +0100
form and structure
I have a question about how to form the correct structure of nodes in my
result set.

I have an xml file which represents a set of Menu items.
I am attempting to transform each Menu node into an HTML DIV.

My problem is that for each branch of the menu I need to contain the rest of
the entire menu in a further DIV.

A simplified version of the XML is as follows:
(The Description of each Menu reflects its level in the node set)

<?xml version="1.0"?>
<Menu>
	<Menu Description="menuOne">
		<Menu Description="menuOneOne">
		</Menu>
		<Menu Description="menuOneTwo">
			<Menu Description="menuOneTwoOne">
			</Menu>
		</Menu>
		<Menu Description="menuOneThree">
		</Menu>
	</Menu>
	<Menu Description="menuTwo">
		<Menu Description="menuTwoOne">
		</Menu>
	</Menu>
</Menu>



A simplified version of the XSL is as follows:

<xsl:template match="/">
	<xsl:apply-templates select="Menu"/>
</xsl:template>

<xsl:template match="Menu">
	<xsl:variable name="MenuID">menu<xsl:number level="multiple" count="Menu"
format="1_1"/></xsl:variable>
	<DIV>
		<xsl:attribute name="ID">
			<xsl:value-of select="$MenuID"/>
		</xsl:attribute>
		<xsl:value-of select="@Description"/>
	</DIV>
	<xsl:if test="Menu">
		<xsl:apply-templates select="Menu"/>
		<DIV>
			<xsl:attribute name="ID">Block_<xsl:value-of
select="$MenuID"/></xsl:attribute>
		</DIV>
	</xsl:if>
</xsl:template>

The resulting output is as follows

<DIV ID="menu"></DIV>
<DIV ID="menu_1">menuOne</DIV>
<DIV ID="menu_1_1">menuOneOne</DIV>
<DIV ID="menu_1_2">menuOneTwo</DIV>
<DIV ID="menu_1_2_1">menuOneTwoOne</DIV>
<DIV ID="Block_menu_1_2">
</DIV>
<DIV ID="menu_1_3">menuOneThree</DIV>
<DIV ID="Block_menu_1">
</DIV>
<DIV ID="menu_2">menuTwo</DIV>
<DIV ID="menu_2_1">menuTwoOne</DIV>
<DIV ID="Block_menu_2">
</DIV>
<DIV ID="Block_menu">
</DIV>

However, the desired output is to have the 'Block' DIVs surrounding the rest
of the menu as follows, with the order of the menu DIVs remaining the same:

<DIV ID="menu"></DIV>
<DIV ID="menu_1">menuOne</DIV>
<DIV ID="menu_1_1">menuOneOne</DIV>
<DIV ID="menu_1_2">menuOneTwo</DIV>
<DIV ID="menu_1_2_1">menuOneTwoOne</DIV>
<DIV ID="Block_menu_1_2">
	<DIV ID="menu_1_3">menuOneThree</DIV>
	<DIV ID="Block_menu_1">
		<DIV ID="menu_2">menuTwo</DIV>
		<DIV ID="menu_2_1">menuTwoOne</DIV>
		<DIV ID="Block_menu_2">
			<DIV ID="Block_menu">
			</DIV>
		</DIV>
	</DIV>
</DIV>

I think that what I need to do is to change the XSL to be something like

	<xsl:if test="Menu">
		<xsl:apply-templates select={expression to select only direct descendents
of current node} />
		<DIV>
			<xsl:attribute name="ID">Block_<xsl:value-of
select="$MenuID"/></xsl:attribute>
			<xsl:apply-templates select={expression to select only following siblings
of current node} />
		</DIV>
	</xsl:if>


but I have not managed to get anywhere near what I am after, so maybe I am
barking up the wrong tree.
It seems as though what I am trying to do is create a nested structure based
on the structure of the original XML, but using different nodes.

Does anyone have any ideas as to how to approach this problem?

I can probably write something in ASP to convert the XML for me, but I would
rather find out how it could be done in XSL.

Thanks for any pointers/ideas.

David Baldwin






 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.