RE: [xsl] restructuring element hierarchy using xslt

Subject: RE: [xsl] restructuring element hierarchy using xslt
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Mon, 29 Sep 2003 18:17:24 +0100
The normal <xsl:apply-templates/> processes the children in the XML
tree. All that you need is an <xsl:apply-templates that processes the
children in the logical tree.

Start by processing the top level elements:

<xsl:apply-templates select="het[string-length(@position)=1]"/>

And when you process a <het> element, process it's logical children.
These are the nodes whose @position (a) starts with the @position of the
current node, and (b) contain one more "." than the @position of the
current node:

<xsl:template match="het">
<xsl:copy>
  <xsl:apply-templates select="following-sibling::het[
     starts-with(@position, current()/@position) and
     number-of-dots(@position) =
number-of-dots(current()/@position)+1]"/>
</xsl:copy>
</xsl:template>

Here number-of-dots(X) should be expanded as:

string-length(X) - string-length(translate(X, '.', ''))

Untested.

Michael Kay

> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> james walker
> Sent: 29 September 2003 13:00
> To: XSL-List@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] restructuring element hierarchy using xslt
> 
> 
> I have an xml document like this:
> 
> <het position="1"></het>
> <het position="1.1"></het>
> <het position="1.1.1"></het>
> <het position="1.1.2"></het>
> <het position="1.2"></het>
> <het position="1.2.1"></het>
> <het position="2"></het>
> <het position="2.1"></het>
> <het position="2.1.1"></het>
> 
> and i was trying to get it to look like this:
> 
> <het position="1">
> 	<het position="1.1">
> 		<het position="1.1.1">
> 		</het>
> 		<het position="1.1.2">
> 		</het>
> 	</het>
> 	<het position="1.2">
> 		<het position="1.2.1">
> 		</het>
> 	</het>
> </het>
> <het position="2">
> 	<het position="2.1">
> 		<het position="2.1.1">
> 		</het>
> 	</het>
> </het>
> 
> In other words make it nested. I can get the first set of  
> elements out by 
> doing a contains() function in a predicate (<xsl:template 
> match="het[contains(@position, '.')=false]">) but i am having 
> a problem with 
> template matching, i know i can't put a template match within 
> a template 
> match and this is causing me a bit of trouble.
> 
> _________________________________________________________________
> Get Hotmail on your mobile phone http://www.msn.co.uk/msnmobile
> 
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 


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


Current Thread